天天看點

内部類

    内部類就是在一個類的内部定義的類,内部類中不能定義靜态成員(靜态成員不是對象的特性,隻是為了找一個容身之處,是以需要放到一個類中而已,這麼一點小事,你還要把它放到類内部的一個類中,過分了啊!提供内部類,不是為讓你幹這種事情,無聊,不讓你幹。我想可能是既然靜态成員類似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 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 修飾符。

    備注:首先根據你的印象說出你對内部類的總體方面的特點:例如,在兩個地方可以定義,可以通路外部類的成員變量,不能定義靜态成員,這是大的特點。然後再說一些細節方面的知識,例如,幾種定義方式的文法差別,靜态内部類,以及匿名内部類。