繁体   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