內部類

    內部類就是在一個類的內部定義的類,內部類中不能定義靜態成員(靜態成員不是對象的特性,只是爲了找一個容身之處,所以需要放到一個類中而已,這麼一點小事,你還要把它放到類內部的一個類中,過分了啊!提供內部類,不是爲讓你幹這種事情,無聊,不讓你幹。我想可能是既然靜態成員類似c 語言的全局變量,而內部類通常是用於創建內部對象用的,所以,把“全局變量”放在內部類中就是毫無意義的事情,既然是毫無意義的事情,就應該被禁止),內部類可以直接訪問外部類中的成員變量,內部類可以定義在外部類的方法外面,也可以定義在外部類的方法體中,如下所示:

public class Outer {
int out_x = 0;
public void method() {
Inner1 inner1 = new Inner1();
public class Inner2 {//在方法體內部定義的內部類
public method(){
out_x = 3;
}
}
Inner2 inner2 = new Inner2();
}
public class Inner1 { //在方法體外面定義的內部類
 
}
}
    在方法體外面定義的內部類的訪問類型可以是public,protecte,默認的,private 等4 種類型,這就好像類中定義的成員變量有4 種訪問類型一樣,它們決定這個內部類的定義對其他類是否可見;對於這種情況,我們也可以在外面創建內部類的實例對象,創建內部類的實例對象時,一定要先創建外部類的實例對象,然後用這個外部類的實例對象去創建內部類的實例對象,代碼如下:
Outer outer = new Outer();
Outer.Inner1 inner1 = outer.new Innner1();
    在方法內部定義的內部類前面不能有訪問類型修飾符,就好像方法中定義的局部變量一樣,但這種內部類的前面可以使用final 或abstract 修飾符。這種內部類對其他類是不可見的其他類無法引用這種內部類,但是這種內部類創建的實例對象可以傳遞給其他類訪問。這種內部類必須是先定義,後使用,即內部類的定義代碼必須出現在使用該類之前,這與方法中的局部變量必須先定義後使用的道理也是一樣的。這種內部類可以訪問方法體中的局部變量,但是,該局部變量前必須加final 修飾符。
    對於這些細節,只要在eclipse 寫代碼試試,根據開發工具提示的各類錯誤信息就可以馬上瞭解到。
    在方法體內部還可以採用如下語法來創建一種匿名內部類,即定義某一接口或類的子類的同時,還創建了該子類的實例對象,無需爲該子類定義名稱:
public class Outer {
public void start() {
new Thread( new Runable(){
public void run(){};
}
).start();
}
}
    最後,在方法外部定義的內部類前面可以加上static 關鍵字,從而成爲Static Nested Class,它不再具有內部類的特性,所有,從狹義上講,它不是內部類。Static Nested Class 與普通類在運行時的行爲和功能上沒有什麼區別,只是在編程引用時的語法上有一些差別,它可以定義成public、protected、默認的、private等多種類型,而普通類只能定義成public 和默認的這兩種類型。在外面引用Static Nested Class 類的名稱爲“外部類名.內部類名”。在外面不需要創建外部類的實例對象,就可以直接創建Static Nested Class,例如,假設Inner 是定義在Outer 類中的Static Nested Class,那麼可以使用如下語句創建Inner 類:
Outer.Inner inner = new Outer.Inner();
    由於static Nested Class 不依賴於外部類的實例對象,所以,static Nested Class 能訪問外部類的非static成員變量。當在外部類中訪問Static Nested Class 時,可以直接使用Static Nested Class 的名字,而不需要加上外部類的名字了,在Static Nested Class 中也可以直接引用外部類的static 的成員變量,不需要加上外部類的名字。
    在靜態方法中定義的內部類也是Static Nested Class,這時候不能在類前面加static 關鍵字,靜態方法中的Static Nested Class 與普通方法中的內部類的應用方式很相似,它除了可以直接訪問外部類中的static 的成員變量,還可以訪問靜態方法中的局部變量,但是,該局部變量前必須加final 修飾符。
    備註:首先根據你的印象說出你對內部類的總體方面的特點:例如,在兩個地方可以定義,可以訪問外部類的成員變量,不能定義靜態成員,這是大的特點。然後再說一些細節方面的知識,例如,幾種定義方式的語法區別,靜態內部類,以及匿名內部類。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章