爲什麼使用內部類
內部類(inner class)是定義在另外一個類中的類。爲什麼需要使用內部類呢?主要有一下三點:
- 內部類方法可以訪問該類定義所在的作用域中的數據,包括私有數據。
- 內部類可以對同一個包的其他類隱藏起來。
- 當像要定義一個回調函數且不想編寫大量代碼時,使用匿名(anonymous)內部類比較便捷
使用內部類訪問對象狀態
內部類既可以訪問自身數據域,也可以訪問創建它的外圍對像的數據域
public class JdkTest {
private static boolean name;
class Name{
public void start() {
if (JdkTest.name) {}
}
}
}
訪問格式是:外部類.屬性
內部類的特殊語法規則
- 引用外部類屬性
表達式:OuterClass.外部類屬性
public class JdkTest {
private static boolean name;
class name{
public void start() {
if (JdkTest.name) {}
}
}
}
- 在外部類中創建內部類對象
public class JdkTest {
private static boolean name;
public void test() {
JdkTest.Name name = this.new Name();
}
class Name{
public void start() {
if (JdkTest.name) {}
}
}
}
- 在外部類之外創建內部類對象
public class JdkTest {
private static boolean name;
public void test() {
JdkTest.Name name = this.new Name();
}
class Name{
public void start() {
if (JdkTest.name) {}
}
}
public static void main(String[] args) {
JdkTest test = new JdkTest();
JdkTest.Name name = test.new Name();
}
}
外部類和外部類之外創建內部類格式:outerClass.new InnerClass
外部類和外部類之外引用內部類格式: OuterClass.InnerClass
匿名內部類
創建一個抽象類的新對象實現抽象方法,定義在括號{}內
語法格式爲:
new SuperType()
{
inner class methods and data
}
Arrays.sort(list, new Comparator<String> {
public int compare(String o1, String o2){
// 方法實現
};
});
靜態內部類
有時候,使用內部類只是爲了把一個類隱藏在另外一個類的內部,並不需要內部類引用外圍類對象。爲此,可以將內部類聲明爲static
,以便取消引用。
注意事項
內部類中聲明的所有靜態域都必須是final
。原因很簡單,我們希望一個靜態域只有一個實例,不過對於每個外部對象,會分別有一個單獨的內部類實例。如果這個域不是final
,他就有可能不是唯一的。
內部類中不允許有static
方法