複製鏈接
請複製以下鏈接發送給好友

嵌套類

鎖定
嵌套類(Nested Class),是 Java 中對的一種定義方式。嵌套類分為兩種:靜態嵌套類和非靜態嵌套類。非靜態嵌套類,又稱為內部類(Inner Class)。
中文名
嵌套類
外文名
Nested Class

嵌套類定義

以下內容來自 Java 官方教程中的《嵌套類》章節。 [1] 
Java 編程語言允許一個被定義在另一個類中,這樣的類就稱為嵌套類
包含嵌套類的類,可稱為外圍類(Enclosing Class)或外部類(Outer Class)。嵌套類可作為其外圍類的成員。非靜態嵌套類(內部類)可訪問其外圍類的其他成員,即使這些成員被聲明為私有的。靜態嵌套類不能訪問其外圍類的其他成員。
若嵌套類作為其外部類的成員,則它可聲明為 private、public、protected 或包私有的。
  • 提示:外部類只能聲明為 public 或包私有的。

嵌套類為何使用嵌套類

使用嵌套類的主要理由是:
  • 它是一種只對一個地方使用的類進行邏輯分組的方法:如果一個類只對另一個類有用,那麼將其嵌入到該類中並使這兩個類保持在一起是合乎邏輯的。嵌套這樣的“助手類(Helper Class)”使它們所在的包更為精簡。
  • 它增強了封裝性:考慮兩個頂層類(Top-Level Class),A 和 B,當 B 需要訪問 A 中被聲明為 private 的成員時,可將 B 嵌入 A 中,這樣 B 就可以訪問 A 中的私有成員了。此外,B 本身也可以對外界隱藏起來。
  • 它使代碼更具可讀性和可維護性:在頂層類中嵌套小類,會使代碼更接近其使用的位置。

嵌套類靜態嵌套類

與類的方法和變量一樣,靜態嵌套類與其外部類相關聯。與類的靜態方法一樣,靜態嵌套類不能直接引用其外圍類中定義的實例變量或方法,它只能通過對象引用來使用它們。
靜態嵌套類創建對象的語法:
OuterClass.StaticNestedClass nestedObject =new OuterClass.StaticNestedClass();
靜態嵌套類是外部類的靜態成員,它可以直接使用外部類名.靜態嵌套類名訪問自身。它可以訪問外部類的靜態成員和靜態私有成員。與其他類一樣,靜態嵌套類不能訪問非靜態成員。使用靜態嵌套類對象訪問外部類的實例變量和實例方法。例如:OuterClass.StaticNestedClass
/**
 * 定義一個公共的 OuterClass 類。
 */
public class OuterClass {
    private final String name;

    public static void main(String[] args) {
        String name = "Java";
        OuterClass outerObject = new OuterClass(name);
        OuterClass.StaticNestedClass nestedObject =
                new OuterClass.StaticNestedClass(name);
        System.out.println(outerObject.getName());
        System.out.println(nestedObject.getName());
    }

    /**
     * 定義一個 OuterClass 類的構造方法。
     *
     * @param name 表示一個名稱字符串。
     */
    public OuterClass(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    /**
     * 定義一個包私有的 StaticNestedClass 類。
     */
    static class StaticNestedClass {
        private final String name;

        /**
         * 定義一個 StaticNestedClass 類的構造方法。
         *
         * @param name 表示一個名稱字符串。
         */
        public StaticNestedClass(String name) {
            this.name = name + " (in the nested object)";
        }

        public String getName() {
            return name;
        }
    }
}
/* 輸出結果:
Java
Java (in the nested object)

 */
想要了解有關靜態嵌套類的更多信息,請參閲詞條:《靜態嵌套類》。

嵌套類內部類

與實例的方法和變量一樣,內部類與其外圍類的實例相關聯,並可直接訪問該外圍類對象的方法和字段。此外,由於內部類與實例相關聯,因此不能在內部類中定義任何靜態成員。
非靜態嵌套類( Non-static Nested Classes ):一般稱為內部類( Inner Classes )。
內部類又分為:成員內部類(Member inner class)、局部內部類(Local inner class)、匿名內部類(Anonymous inner class)
public class AnonymousInner {
	 public static void main(String[] args){
	        // 使用匿名內部類實例化抽象類Person
	        Person p = new Person() {  
	            void create() {System.out.println(str);}  
	        };
	        p.create();
	        
	        Animal a = new Animal() {  
	            public void run(){System.out.println("匿名內部類通過接口創建對象");}  
	        };  

	        a.run();
	    }  
	}  
abstract class Person { 
	String str = "匿名內部類通過抽象類創建對象";
    abstract void create();  
}  

interface Animal{  
    void run();  
}  
內部類不能定義任何靜態成員,內部類的實例化對象存在於外部類的實例化對象中。要實例化一個內部類,必須先實例化其外部類。
OuterClass.InnerClass innerObject =new OuterClass.InnerClass();
/**
 * 定義一個公共的 OuterClass 類。
 */
public class OuterClass {
    private final String name;

    public static void main(String[] args) {
        String name = "Java";
        OuterClass outerObject = new OuterClass(name);
        OuterClass.InnerClass innerObject = outerObject.new InnerClass();
        System.out.println(outerObject.getName());
        System.out.println(innerObject.getName());
    }

    /**
     * 定義一個 OuterClass 類的構造方法。
     *
     * @param name 表示一個名稱字符串。
     */
    public OuterClass(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    /**
     * 定義一個私有的 InnerClass 類。
     */
    private class InnerClass {
        private final String name;

        /**
         * 定義一個 InnerClass 類的構造方法。
         */
        public InnerClass() {
            name = OuterClass.this.name + " (in the inner object)";
        }

        public String getName() {
            return name;
        }
    }
}
/* 輸出結果:
Java
Java (in the inner object)

 */
想要了解有關內部類的更多信息,請參閲詞條:《內部類》。
參考資料