
這一章又長又難,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();
}
}
} ///:~
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 {}
}
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);
}
}
//! 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, 內部類與控制框架
太難了,跳掉。。。