8.10 內部類(Inner Class)
內部類是Java語言中的一種特殊的語法,簡單的來說,就是在一個類的內部再聲明一個類,這些聲明在類內部的類就被稱作內部類。在實際聲明時,內部類可以聲明在類的內部、類的方法內部,也可以聲明在類的構造方法內部,內部類聲明的語法格式和一般類的聲明一樣,只是內部類聲明時可以使用static修飾符進行修飾。
對於內部類的相關使用,本部分不做深入的介紹,只是進行簡單的說明,輔助建立內部類的概念,能夠進行一些基本的使用。
下面是一個簡單的內部類的示例代碼:
/**
* 內部類基本使用示例代碼
*/
public class OutClass {
int i = 0;
public class InnerClass{
public void test(){
i++;
}
}
}
在該示例代碼中,類InnerClass聲明在了類OutClass的內部,所以InnerClass被稱為內部類,而OutClass則被稱為InnerClass的外部類。
該代碼編譯以後,將生成兩個class文件,一個是OutClass.class,另外一個是OutClass$InnerClass.class。這裡需要說明的是,內部類也被編譯成一個獨立的類文件,類文件的名稱為:外部類類名$內部類類名.class。
在內部類中,可以很方便的訪問外部類的屬性i,而外部類不能直接引用內部類中的屬性和方法,語法中提供了一套專門的格式來訪問內部類中的屬性和方法,這些語法這裡就不作介紹了。
內部類是Java語言誕生以後新增的一個語法,設計該語法的初衷主要有兩個:
1、隱藏內部類的實現
也就是將只有被外部類使用的功能隱藏在內部類的內部,其它類訪問這個內部類時的語法會比較復雜,從而在一定程度了避免了其它類對於內部類的訪問。
2、內部類可以訪問外部類的所有屬性和方法,避免了參數傳遞
在內部類中,可以訪問外部類中的所有屬性和方法,private訪問控制符修飾的屬性和方法也可以被內部類訪問,這樣將方便內部類的編寫,避免了參數傳遞,也減少了外部類需要向其它類開放的屬性和方法的數量。
當然,內部類除了帶來一系列的好處以外,還帶來了一系列的不足,主要的不足有如下幾點:
1、增加了語法的復雜度
在一個類的內部聲明一個類,使Java語言的復雜度增加了很多,也在一定程度上損害了Java語言的編程風格,同時使閱讀代碼的難度大幅度的增加。
2、使整個項目的結構變得復雜
內部類通過增加每個類的復雜度,使得項目的結構變得更加復雜,而且沒有原來的結構那麼清晰。
當前內部類的語法在以下編程技術中的應用比較多:
1、圖形用戶界面編程中的事件處理
2、Java語言API中部分功能類的實現
綜合以上說明,在實際的開發過程中,如果不是十分必要,不建議編寫內部類,對於內部類實現的功能可以使用類和類之間的調用進行實現,這樣可以保留Java語言清晰的編程風格。
最後需要特別說明的是:在Java語法中,一個源代碼內部可以編寫多個類,例如:
/**
* 一個類內部聲明多個類
*/
public class TwoClassInOneFile {
int n = 0;
public void method(){}
}
class AnotherClass {
char c;
public void t(){}
}
這樣的源代碼,在編譯時,將生成兩個獨立的class的文件:TwoClassInOneFile.class和AnotherClass.class,這樣的結構不是內部類。
在實際項目中,不推薦進行這樣的編碼,主要原因是不方便類源代碼的查找,而推薦每個源文件內部只聲明一個類的形式。