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

Java ClassName.this 語法深度解析:內部類存取外部類實例的關鍵

     編輯:Java 相關知識

前言

ClassName.this 是 Java 內部類存取外部類實例的專用語法。本文將從 this 三大基本用法切入,深入剖析內部類影子變數問題、OuterClass.this 的必要性與實戰場景。

this 三大基本用法回顧

  1. 存取實例欄位:消除區域變數遮蔽(this.field = field;)。
  2. 呼叫其他建構子:this(...) 必須置於建構子首行。
  3. 傳遞當前實例:obj.method(this)、return this (Builder 模式)。

內部類陷阱:this 指向誰?

public class Outer {
    private String name = "Outer";
    
    class Inner {
        private String name = "Inner";
        
        void print() {
            System.out.println(name);        // Inner
            System.out.println(this.name);   // Inner (this 指向 Inner 實例)
            System.out.println(Outer.this.name); // Outer (關鍵語法!)
        }
    }
}

規則:內部類中裸 this 指向內部類實例;需用 OuterClass.this 明確存取外部類實例。

Android 實戰經典場景

public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        Button btn = findViewById(R.id.btn);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 錯誤:new Intent(this, Target.class) 這裡的 this 是 OnClickListener 實例
                // 正確:
                Intent intent = new Intent(MainActivity.this, TargetActivity.class);
                startActivity(intent);
                
                // 關閉外部 Activity
                MainActivity.this.finish();
            }
        });
    }
}

匿名內部類中 this 指向匿名類實例,必須用 OuterActivity.this 取得 Context。

靜態內部類不需要 OuterClass.this

public class Outer {
    static class StaticInner {
        void demo() {
            // 編譯錯誤:Outer.this 無法在靜態內容中使用
            // 靜態內部類不持有外部類引用
        }
    }
}

靜態內部類無 Outer.this 隱含引用,故無法使用該語法。

Lambda 表達式與 this

public class LambdaDemo {
    String value = "Outer";
    
    void test() {
        Runnable r = () -> {
            System.out.println(this.value);  // Lambda 無 this,捕獲外部實例 → "Outer"
        };
        new Thread(r).start();
    }
}

Lambda 沒有自己的 this,this 直接指向外層實例,無需 Outer.this。

總結對照表

情境this 指向存取外部實例
一般類別當前實例直接用 this
非靜態內部類/匿名類內部類實例OuterClass.this
靜態內部類無外部實例引用不可用
Lambda 表達式外層實例直接用 this

最佳實踐建議

  • 內部類欄位避免與外部類同名,減少影子變數困擾。
  • 需要外部 Context/Activity 時,明確寫 OuterClass.this,提升可讀性。
  • 優先考慮 static 內部類或 Lambda,避免隱含持有外部引用導致記憶體洩漏。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved