標籤:
什麼時候使用:
當A類中的內容要被B類直接存取,而A類還需要建立B的對象,訪問B的內容時,將B稱之為內部類(內建類、嵌套類)。
訪問方式:
內部類可以直接存取外部類中的所有成員,包含私人的;而外部類要想訪問內部類中的成員,必須建立內部類的對象。
class Outer//外部類{ private int num = 4; public calss Inner//內部類{ void show(){ System.out.println("num=num"); } } void method(){ /*Outer.*/Inner in = new /*Outer.*/Inner(); in.show(); } }class InnerClassDemo{ public static void main(String[] args){ Outer out = new Outer(): out.method(); } }public static void main(String[] args){ Outer out = new Outer(); out.method(); //測試情況一:直接存取Outer中的Inner內部類的非靜態成員 //建立內部類的對象就可以了,內部類作為成員,應該先有外部類對象,再有內部類對象。 Outer.Inner in = new Outer().new Inner(); in.show(); //測試情況二:對靜態內部類中的非靜態成員進行調用 //因為內部類是靜態,所以不需要建立Outer的對象,直接建立內部類對象就可以了。 Outer.Inner2 in = new Outer().new Inner2(); in.show2(); }
怎麼訪問的:
為什麼內部類就能直接存取外部類中的成員呢?
因為內部類其實持有了外部類的引用, 外部類.this,對於靜態內部類不持有外部類.this 而是直接使用 外部類名
局部內部類特點:
匿名內部類,其實就是一個帶有內容的子類對象。
class InnerClassDemo4{ public static void main(String[] args){ Outer out = new Outer(); AbsDemo a = out.getObject();//多態 a.show();<span style="white-space:pre"></span> }}
現在不想建立具體的子類型,但還想建立AbsDemo的子類對象,如何??
直接使用父類就可以了,可是在該例中是抽象類別,怎麼new對象?→重寫抽象方法。
new AbsDemo(){ //重寫抽象的show方法 void show(){ System.out.println("num="+num);<span style="white-space:pre"></span> }}
這就是傳說中的一個AbsDemo的子類對象,只不過這是一個帶著內容的子類休想。
格式:new 父類or介面(){子類的內容}
其實尼匿名內部類就是內部類的簡化形式;注意匿名內部類有前提,必須要繼承父類或者實現介面。
注意:
如果內部類有靜態成員,該如何訪問:
既然靜態內部類已經隨外部類載入,而且靜態成員隨著類的載入而載入,就不需要對象,直接用類名調用即可。
Outer.Inner2.staticShow();
static void show1(){}//非靜態內部類中不允許定義靜態成員;僅允許在非靜態內部類中定義靜態常量(static final)
如果想要在內部類中定義靜態成員,必須內部類也要被靜態修飾。
java 內部類