首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Java 非靜態內部類在靜態方法中無法實例化:添加 static 修飾符解決

     編輯:程式設計疑難解答

錯誤代碼

public class TestExtend {
    class A { ... }
    class B extends A { ... }
    public static void main(String[] args) {
        B b = new B(); // 編譯錯誤:非靜態內部類無法在靜態上下文中引用
    }
}

原因

A、B 為非靜態內部類(成員內部類),其實例隱式持有外部類 TestExtend 實例的引用。在 static main 方法中無 this 引用,無法創建內部類實例。

解決方案:聲明為 static 內部類

public class TestExtend {
    static class A { ... }      // 添加 static
    static class B extends A { ... } // 添加 static
    public static void main(String[] args) {
        B b = new B(); // 正常編譯運行
        b.f();
    }
}

區別對比

類型創建語法訪問外部類實例成員適用場景
非靜態內部類outer.new Inner()可直接訪問(含 private)需依賴外部類狀態的輔助類
靜態內部類new Outer.Inner()僅能訪問 static 成員獨立工具類、Builder、數據容器

最佳實踐

  • **默認使用 static 內部類**,除非確確實實需要訪問外部類實例成員。
  • 靜態內部類不持有外部引用,避免內存洩漏(如 Handler、Runnable 等長生命周期對象)。
  • 若確需非靜態,在靜態方法中先創建外部類實例:TestExtend outer = new TestExtend(); B b = outer.new B();
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved