
這一章又長又難,sign,挺過這一章估計就輕松點了
1.
內(nèi)部類可以訪問外圍類的所有元素,包括private字段,原因在于內(nèi)部類對象保存了一個指向外圍類對象的引用。因此內(nèi)部類的對象只能在與其外部類的對象相關(guān)聯(lián)的情況下才能被創(chuàng)建。構(gòu)建內(nèi)部類對象時,需要一個指向其外圍類對象的引用。
2. 嵌套類(nested)
如果不需要內(nèi)部類對象與外圍類對象有聯(lián)系,可以將內(nèi)部類聲明為static,稱為嵌套類。普通的內(nèi)部類對象隱式地保存了一個引用,指向創(chuàng)建它的外部類對象。然而,當(dāng)內(nèi)部類是static時,就不是這樣了。這意味著:
1)要創(chuàng)建嵌套類的對象,并不需要外圍類的對象。
2)不能從嵌套類的對象中訪問非靜態(tài)的外圍類對象。
嵌套類與普通內(nèi)部類的另一個區(qū)別在于,普通內(nèi)部類的字段與方法,只能放在類的外部層次上,所以普通的內(nèi)部類不能有static數(shù)據(jù)和static字段,也不能包含嵌套類,但是嵌套類可以包含所有的這些東西(不怎么理解誒)
另外,正常情況下,不能在接口內(nèi)部放置任何代碼,但由于嵌套類是static的,因此可以作為接口的一部分。
在每個類中寫一個main()方法,可以用來測試這個類,但這樣會在編譯時產(chǎn)生額外的內(nèi)容。可以使用嵌套類防止測試代碼
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();
}
}
} ///:~
發(fā)布的時候刪除TestBed$Tester.class即可
3. 引用外部類的對象
外圍類名稱 + ".this"
要創(chuàng)建非靜態(tài)內(nèi)部類,必須使用外圍類的對象:
Parcel11 p = new Parcel11();
Parcel11.Contents c = p.new Contents();
4. 多層嵌套類
類比二層的嵌套類即可
注意這里有個名次混淆的地方,非static類也可以嵌套起來使用,但是非static類內(nèi)部就不能有static類了。
5. 內(nèi)部類的繼承
內(nèi)部類指向外圍類的隱藏引用必須被初始化
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. 內(nèi)部類的覆蓋
繼承某個外圍類的時候,內(nèi)部類并不會發(fā)生變化,即使“重寫”了內(nèi)部類代碼。不過可以用Thinking
in Java上介紹的,明確繼承某個內(nèi)部類。
7. 為什么要用內(nèi)部類
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.”
使用內(nèi)部類最吸引人的原因是:
每個內(nèi)部類都能獨立地繼承一個(接口的)實現(xiàn),所以無論外圍類是否已經(jīng)繼承某個(接口的)實現(xiàn),對于內(nèi)部類都沒有影響。
由此可見,接口解決了部分問題,而內(nèi)部類有效地實現(xiàn)了“多重繼承”。
8. 閉包與回調(diào) Closure & Callbacks
閉包是一個可調(diào)用的對象,它記錄了一些信息,這些信息來自于創(chuàng)建它的作用域。由此可見內(nèi)部類是面向?qū)ο蟮拈]包。通過內(nèi)部類提供閉包的功能是完美的解決方案,它比指針更靈活、安全。
9, 內(nèi)部類與控制框架
太難了,跳掉。。。