方法本地内部类隐藏方法字段

时间:2017-07-06 07:31:23

标签: java inner-classes

给出以下类定义

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;

相反,在method-local内部类中声明的字段与method-local-variable的名称相同,将永久隐藏后者。

4 个答案:

答案 0 :(得分:2)

你所指的是变量 shadowing link)。

  

如果是类型的声明(例如成员变量或参数   name)在特定范围内(例如内部类或方法)   定义)与封闭中的另一个声明具有相同的名称   范围,然后声明影响封闭的声明   范围。您不能仅通过其名称来引用带阴影的声明。

如果隐藏了变量,如果可能的话,如果没有明确指定其范围,则无法再访问该变量。在这种情况下,唯一的解决方案是重命名外部或内部变量。

答案 1 :(得分:1)

不,你不能。函数内部的变量完全被遮蔽,你不能再引用它,因为Java没有办法引用函数上下文。

但是,您可以使用上下文访问顶级变量,即使它们被遮蔽(实际上您没有阴影并且创建具有相同名称的本地变量)。

答案 2 :(得分:0)

你不能,因为它被遮蔽了。

你甚至不能使用反射,因为反射适用于类型级别,而不是字节代码。

如果您使用生成的字节代码,则可以使用其他工具。

答案 3 :(得分:0)

在您的情况下,我不认为您可以访问m方法中定义的局部变量show,因为您已经在内部类中声明了它,因此将其遮蔽。

使用ClassName.this.varName之类的结构只允许您访问该封闭类的成员。这意味着您不能使用该类型的表达式来访问方法中定义的阴影局部变量,因为它们不是该类的成员。