簡體   English   中英

方法局部內部類隱藏方法字段

[英]Method local inner class hides method fields

給定以下類定義

public class MethodLocalAccess {

    int m = 10;

    String show(){
        final int m = 20;
        final int n = 30;
        class MyClass{
            int m = 40;
            String someOtherMethod(){
                return "" + m + n + this.m + MyClass.this.m + MethodLocalAccess.this.m;
            }
        }

        MyClass object = new MyClass();
        return object.someOtherMethod();
    }

    public static void main(String[] args) {
        System.out.println(new MethodLocalAccess().show());
    }

}

產生輸出4030404010 ,這是相當確定的原因。 我想知道,如果局部變量final int m = 20; 可以在內部類內部訪問。

換句話說,在方法本地內部類中聲明的字段與方法本地變量相同的字段將永久隱藏后者。

您指的是所謂的可變陰影link )。

如果特定作用域(例如內部類或方法定義)中的類型的聲明(例如成員變量或參數名稱)與封閉范圍中的另一個聲明具有相同的名稱,則該聲明將覆蓋該聲明封閉范圍。 您不能僅憑其名稱引用帶陰影的聲明。

遮蓋變量后,如果可能的話,如果沒有明確指定其范圍,就無法再訪問它。 在這種情況下,唯一的解決方案是重命名外部或內部變量。

不,你不能。 函數內部的變量完全被遮蓋,您不能再引用它,因為Java無法引用函數上下文。

但是,即使它們被遮蔽,您也可以使用上下文訪問頂級變量( 實際上您並不是在遮蔽並且創建具有相同名稱的局部變量 )。

您不能,因為它被遮蓋了。

您甚至不能使用反射,因為反射在類型級別上起作用,而不在字節碼上起作用。

如果您使用生成的字節碼,則可以使用其他工具。

在您的情況下,我認為您無法訪問在show方法中定義的局部變量m ,因為您已經在內部類中聲明了它,因此將其隱藏起來。

使用類似ClassName.this.varName ,您只能訪問該封閉類的成員。 這意味着您不能使用該類型的表達式來訪問方法中定義的陰影局部變量,因為它們不是該類的成員。

  • 是的,在方法本地內部類中聲明的字段與方法本地變量相同的字段將永久隱藏后者。

  • 我們可以訪問局部變量最終int m = 20
    僅當您沒有Myclass的實例變量時,才使用內部類,否則不存在int m = 40。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM