-
嵌套類
鎖定
- 中文名
- 嵌套類
- 外文名
- Nested Class
嵌套類定義
以下內容來自 Java 官方教程中的《嵌套類》章節。
[1]
包含嵌套類的類,可稱為外圍類(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) */
想要了解有關內部類的更多信息,請參閲詞條:《內部類》。
- 參考資料
-
- 1. 嵌套類 .Oracle[引用日期2020-06-24]