这一章又长又难,sign,挺过这一章估计就轻松点了
1.
内部类可以访问外围类的所有元素,包括private字段,原因在于内部类对象保存了一个指向外围类对象的引用。因此内部类的对象只能在与其外部类的对象相关联的情况下才能被创建。构建内部类对象时,需要一个指向其外围类对象的引用。
2. 嵌套类(nested)
如果不需要内部类对象与外围类对象有联系,可以将内部类声明为static,称为嵌套类。普通的内部类对象隐式地保存了一个引用,指向创建它的外部类对象。然而,当内部类是static时,就不是这样了。这意味着:
1)要创建嵌套类的对象,并不需要外围类的对象。
2)不能从嵌套类的对象中访问非静态的外围类对象。
嵌套类与普通内部类的另一个区别在于,普通内部类的字段与方法,只能放在类的外部层次上,所以普通的内部类不能有static数据和static字段,也不能包含嵌套类,但是嵌套类可以包含所有的这些东西(不怎么理解诶)
另外,正常情况下,不能在接口内部放置任何代码,但由于嵌套类是static的,因此可以作为接口的一部分。
在每个类中写一个main()方法,可以用来测试这个类,但这样会在编译时产生额外的内容。可以使用嵌套类防止测试代码
public class TestBed {
public TestBed() {}
public void f() { System.out.println("f()");
}
public static class Tester {
public
static void main(String[] args) {
TestBed t = new TestBed();
t.f();
}
}
} ///:~
发布的时候删除TestBed$Tester.class即可
3. 引用外部类的对象
外围类名称 + ".this"
要创建非静态内部类,必须使用外围类的对象:
Parcel11 p = new Parcel11();
Parcel11.Contents c = p.new Contents();
4. 多层嵌套类
类比二层的嵌套类即可
注意这里有个名次混淆的地方,非static类也可以嵌套起来使用,但是非static类内部就不能有static类了。
5. 内部类的继承
内部类指向外围类的隐藏引用必须被初始化
class WithInner {
class Inner {}
}
public class InheritInner extends WithInner.Inner {
//! InheritInner() {} // Won't compile
InheritInner(WithInner wi) {
wi.super();
}
public static void main(String[] args) {
WithInner wi
= new WithInner();
InheritInner
ii = new InheritInner(wi);
}
}
6. 内部类的覆盖
继承某个外围类的时候,内部类并不会发生变化,即使“重写”了内部类代码。不过可以用Thinking
in Java上介绍的,明确继承某个内部类。
7. 为什么要用内部类
If I just need a reference to an interface, why don’t I just
make the outer class implement that interface? The answer is “If
that’s all you need, then that’s how you should do it.”
使用内部类最吸引人的原因是:
每个内部类都能独立地继承一个(接口的)实现,所以无论外围类是否已经继承某个(接口的)实现,对于内部类都没有影响。
由此可见,接口解决了部分问题,而内部类有效地实现了“多重继承”。
8. 闭包与回调 Closure & Callbacks
闭包是一个可调用的对象,它记录了一些信息,这些信息来自于创建它的作用域。由此可见内部类是面向对象的闭包。通过内部类提供闭包的功能是完美的解决方案,它比指针更灵活、安全。
9, 内部类与控制框架
太难了,跳掉。。。