Java內部類 inner class

爲什麼使用內部類

內部類(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方法

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章