什么是內部類? Static Nested Class 和 Inner Class 的不同。


什么是內部類? Static Nested Class Inner Class 的不同。
        內部類就是在一個類的內部定義的類,內部類中不能定義靜態成員(靜態成員不是對象的特
性,只是為了找一個容身之處,所以需要放到一個類中而已,這么一點小事,你還要把它放
到類內部的一個類中,過分了啊!提供內部類,不是為讓你干這種事情,無聊,不讓你干。
我想可能是既然靜態成員類似 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 與普通
類在運行時的行為和功能上沒有什么區別,只是在編程引用時的語法上有一些差別,它可以
定義成 publicprotected、默認的、 private 等多種類型,而普通類只能定義成 public 和默
認的這兩種類型。在外面引用 Static Nested Class 類的名稱為外部類名.內部類名。在外
面不需要創建外部類的實例對象,就可以直接創建 Static Nested Class,例如,假設 Inner
是定義在 Outer 類中的 Static Nested Class,那么可以使用如下語句創建 Inner 類:

Outer.Inner inner = newOuter.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 修飾符。
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM