Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 方法本地内部类隐藏方法字段_Java_Inner Classes - Fatal编程技术网

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

Java 方法本地内部类隐藏方法字段,java,inner-classes,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 +

给定以下类定义

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可以在内部类中访问


另一方面,方法局部内部类中声明的字段与方法局部变量同名,将永久隐藏后者

您指的是变量阴影()

如果是类型的声明(如成员变量或参数 名称)在特定范围内(例如内部类或方法 定义)与封装中的另一个声明同名 范围,则该声明将隐藏封闭对象的声明 范围不能仅通过名称引用带阴影的声明


一旦对变量进行了阴影处理,如果可能的话,如果不明确指定其范围,就无法再访问该变量。在这种情况下,唯一的解决方案是重命名外部变量或内部变量。

不,您不能。函数中的变量完全隐藏,您无法再引用它,因为Java无法引用函数上下文


但是,您可以使用该上下文访问顶级变量,即使它们被隐藏(实际上,您没有隐藏并创建同名的局部变量)

你不能,因为它有阴影

您甚至不能使用反射,因为反射工作在类型级别,而不是字节码


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

在您的情况下,我认为您无法访问
show
方法中定义的局部变量
m
,因为您已经在内部类中声明了它,因此将其隐藏

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

  • 是,方法本地内部类中声明的字段具有相同的名称 与局部变量方法一样,将永久隐藏后者

  • 我们可以在
    仅当您没有Myclass的实例变量时才使用内部类, int m=40不存在


但是,您可以使用上下文
访问顶级变量,即使它们有阴影。@SureshAtta这是正确的。OP似乎已经领会了这一点:)我在发布问题之前浏览了链接。但是,这个主题似乎没有明确地对方法局部内部类给予足够的说明。@soufrk,Miljen没有引用同一段中最后一行重要的内容
不能仅通过名称引用隐藏声明。
这意味着,如果可以访问上下文,则可以引用它。由于类具有上下文,因此允许您执行
this.xx
,并且由于函数没有上下文而只有作用域,因此您无法引用它。@SureshAtta。