作者:Flyingis
4. 內部類擁有其外圍類的所有元素的訪問權,當某個外圍類的對象創建了一個內部類對象時,此內部類對象必定會保存一個指向那個外圍類對象的引用。然后,在訪問此外圍類的成員時,就是用那個“隱藏”的引用來選擇外圍類的成員。這與C++嵌套類的設計非常不同,在C++中只是單純的名字隱藏機制,與外圍對象沒有聯系,也沒有隱含的訪問權。
另外,一個內部類被嵌套多少層并不重要,它能透明訪問所有它所嵌入的外圍類的所有成員。
5. 在Java中實現C++的嵌套類功能也是通過嵌套類的機制來實現的,區別是C++中的嵌套類不能訪問私有成員,在Java中則可以。
在Java中,使用嵌套類可以使得內部類對象與其外圍類對象之間有聯系,語法上是將內部類聲明為static。而在普通的內部類中是不能有static數據、static字段和嵌套類的。通常,我們可以在一個普通的內部類中,通過一個特殊的this引用鏈接到其外圍類對象,如外圍類是Fruit,那么在內部類中應該通過Fruit.this來引用外圍類的對象。
6. 內部類的繼承比較特殊,我通過一個例子來向大家展示:
class Fruit {
class Inner {}
}
public class Apple extends Fruit.Inner {
Apple(Fruit f) {
f.super(); //為什么要這樣使用我也不明白
}
public static void main(String[] args) {
Fruit f = new Fruit();
Apple a = new Apple(f);
}
}
其中為什么要外圍類調用super()方法我也不清楚,希望有人指點!
7. 當繼承某個外圍類的時候,內部類并沒有發生任何改變,基類和繼承類中的兩個內部類是完全獨立的實體,各自在自己的命名空間內。如果明確繼承某個內部類,則會覆蓋原來的內部類。如:
public class A extends Atop {
public Inner extends Atop.Inner {}
}
8. 局部內部類和匿名內部類在功能上基本相似,它們的區別在于,如果我們需要一個已命名的構造器,或者需要重載構造器,就要使用局部內部類,它可以提供多個內部類對象。匿名內部類只能用于實例初始化。
9. 內部類標識符是外圍類的名字+$+內部類的名字,如果內部類是匿名的,則會由編譯器產生一個數字作為其標識符。