1. 一個Java程序就是一個類的集合。程序中的類有兩種排列結構。
例如:classEnclosingClass{
……
class ANestedClass{
……
}
}
2. 在某些特殊情況下,也會將一個類放在另一個類的內部定義,這個定義在其他類內部的類被稱爲內部類(有時也叫嵌套類),包含內部類的的類則稱爲外部類(有時也叫宿主類)。
內部類的作用:
內部類提供了更好的封裝,可以把內部類隱藏在外部類之內,不允許同一個包中的其他類訪問。
3.
ü 內部類在外部類中有特權:內部類可以毫無限制地訪問外部類的所有成員(包括私有成員)。但外部類不能訪問內部類的實現細節,比如內部類的屬性。
ü 編譯之後,內部類也可產生單獨的.class文件,文件名爲:外部類名$內部類名.class
ü 和普通的外部類不同,內部類是外部類的一個成員,內部類對象不能單獨存在,它必許依賴一個外部類對象
ü 使用匿名內部類在編寫事件處理驅動的程序時用起來很方便。
ü 只有內部類才能夠是私有的--安全機制,只有其外部類的方法才能夠創建內部類對象。
ü 對於同一個包中的其他類來說,內部類能夠隱藏起來(將內部類用private修飾即可)
3. 如果只需要爲內部類建立一個對象,甚至不必爲該類指定一個名字,這種類被稱爲匿名內部類。
如果滿足下面的一些條件,使用匿名內部類是比較合適的:
ü 只用到類的一個實例
ü 類在定義後馬上用到
ü 類非常小(推薦在4行代碼以下)
ü 給類命名並不會導致你的代碼更容易被理解
4. 內部類也可以在方法或語句塊中,稱爲局部內部類。局部內部類與成員類的基本特性相同,例如局部內部類的實例屬性必屬於其外部類的一個實例,可以通過外部類.class引用外部類的實例等,但它只能使用方法或語句塊中的final常量。
例如:
class A{
public void show(){
final int a = 10;
class B{
B(){
System.out.println(a);
}
}
}
}
內部類可以被定義爲抽象類或接口,但必須被其他的內部類繼承或實現。非靜態內部類不能聲明static成員,只有靜態的內部類可以聲明static成員。
5.沒有名字的內部類稱爲匿名內部類。
普通類:
class 類名 implementsActionListener{
public voidactionPerformed(ActionEvent e){…}
}
new 類名();
匿名內部類:
new ActionListener(){
public voidactionPerformed(ActionEvent e){ … }
};
由於匿名內部類沒有名稱,因此創建匿名內部類對象時,new運算符後是超類或接口的名稱,其後的{}內部爲匿名類的定義(匿名類對象的創建和匿名類的聲明是在一起的)。
6. 匿名類不能是抽象類,因爲系統在創建匿名類的時候,會立即創建匿名類的對象。因此不允許將匿名類定義成抽象類。
ü 匿名類不能有構造方法,因爲匿名類沒有類名,無法定義構造方法,但匿名類可以定義實例初始化塊,通過實例初始化塊來完成構造方法需要完成的事情。
ü 匿名類不能定義任何靜態成員、方法和類;
ü 匿名類不能是public、protected、private、static;
ü 只能創建匿名類的一個實例。
7. 內部類可以聲明爲static或非static,也可以是private、protected、public以及默認的各種訪問控制修飾符,用static修飾的稱爲靜態內部類;沒有用它修飾的簡稱爲內部類。
靜態內部類沒有父類,不能引用外部類實例成員或其他內部類成員。
注意:
ü 靜態內部類可以訪問外部類的任一靜態字段或靜態方法。
ü 像靜態方法或靜態字段一樣,靜態內部類有public、private、default修飾。
ü 靜態內部類不能與外部類同名。
ü 像外部類的靜態方法一樣,不能直接訪問外部類的實例字段和實例方法。
ü 靜態內部類只能定義於外部類的頂層代碼或外部類其他靜態成員類的頂層代碼中(嵌套定義);不能定義於外部類的某個函數中。
如果一個靜態內部類去掉其聲明中的static關鍵字,將其定義移入其外部類的靜方法或靜態初始化代碼段中,就成爲了局部靜態內部類。
局部靜態內部類與靜態內部類基本特性相同。