首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 內部類全解析(二):靜態嵌套類、成員內部類、局部類與匿名類的定義規則、訪問權限與實例化方式

     編輯:Java 相關知識

四類內部類對比

類型聲明位置修飾符外部實例依賴訪問外部成員可定義靜態成員
靜態嵌套類類成員位置任意否僅靜態成員是
非靜態內部類類成員位置任意是所有成員 (含 private)否
局部類 (非靜態上下文)方法/構造器/塊內部無 (默認 package)是外部所有 + 方法 final 變量否
局部類 (靜態上下文)靜態方法/塊內部無否外部靜態成員 + 方法 final 變量否
匿名類 (非靜態上下文)表達式位置隱式 final是外部所有 + 方法 final 變量否
匿名類 (靜態上下文)靜態表達式位置隱式 final否外部靜態成員 + 方法 final 變量否

實例化語法

  • 靜態嵌套類:Outer.Nested n = new Outer.Nested();
  • 非靜態內部類:Outer.Inner i = new Outer().new Inner();
  • 局部類:僅在聲明塊內可實例化,引用需向上轉型為父類/接口類型返回
  • 匿名類:
    new InterfaceName() { /* 方法實現 */ }
    new ClassName(args) { /* 方法實現/字段 */ }

關鍵規則

  • 匿名類隱式 final,不可繼承
  • 匿名類無顯式構造器,可用實例初始化塊替代
  • 匿名類只能 實現一個接口 或 繼承一個類,不可同時
  • 局部/匿名類訪問方法局部變量必須為 final (編譯器複製副本)
  • 內部類可屏蔽外部同名變量,子類中需用 Outer.this.field 顯式限定
  • super 僅指向父類,不可用於訪問外部類 (super.super 非法)
  • 靜態嵌套類可繼承/實現任意類/接口,無限制
  • 所有非匿名嵌套類可聲明 abstract 或 final

代碼演示:多層嵌套與變量遮蔽

class Outer {
    String name = "Vel";
    class Inner {
        String name = "Sharmi";
        class InnerInner {
            class InnerInnerInner {
                void doSomething() {
                    System.out.println(name);           // "Sharmi" (最近遮蔽)
                    System.out.println(Outer.this.name); // "Vel"
                    System.out.println(Inner.this.name); // "Sharmi"
                }
            }
        }
    }
    class InnerChild extends Inner {
        void doSomething() {
            // System.out.println(name); // 編譯錯誤:遮蔽衝突
            System.out.println(Outer.this.name); // "Vel"
            System.out.println(super.name);      // "Sharmi"
            System.out.println(this.name);       // "Sharmi" (繼承自 Inner)
        }
    }
}

靜態嵌套類繼承示例

class Outer2 {
    static String name = "Vel";
    static class Inner2 {
        static String name = "Sharmi";
        class InnerInner2 {
            void doSomething() {
                System.out.println(name);        // "Sharmi"
                System.out.println(Outer2.name); // "Vel"
            }
        }
    }
}
class InnerChild2 extends Outer2.Inner2 { // 頂層類繼承靜態內部類
    void doSomething() {
        System.out.println(name);        // "Sharmi" (繼承)
        System.out.println(Outer2.name); // "Vel"
        System.out.println(super.name);  // "Sharmi"
        System.out.println(this.name);   // "Sharmi"
    }
}

掌握內部類的作用域、實例關聯與變量解析規則,是編寫高內聚、低耦合 Java 代碼的關鍵技能之一。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved