方法本地内部类成员范围访问

如何访问与内部类成员实例或内部类的方法局部变量同名的方法变量?

class A{ int a = 10; //1 public void someMethodA(){ final int a = 20; //2 class B{ int a = 30; //3 public void someMethodB(){ int a = 40; //4 System.out.println("a = "+a); //access 4 System.out.println("a = "+this.a); //access 3 System.out.println("a = "+A.this.a); //access 1 System.out.println(?????); //how do I access value of a ie 2 } } } } 

不,你不能这样做。 原因是,位置2中的变量a是局部变量,只能在封闭范围内使用它的简单名称进行访问。 来自JLS§6.4 :

局部变量(第14.4节),forms参数(第8.4.1节),exception参数(第14.20节)和本地类(第14.3节)只能使用简单名称(第6.2节)引用,而不是限定名称( 6.6节)。

现在,这清除了您只能使用a访问该变量。 但是,在方法局部类B有另一个变量,它在位置2中隐藏局部变量a ,它再次被位置4中的局部变量遮蔽。

现在在print语句中, a将从最近的封闭范围访问变量,即位置4的局部变量。 如果删除该变量,它将在位置3处打印变量。 然后,如果你删除它,它将在2位打印变量。

所以,关键是,没有办法访问位置2的局部变量a ,因为它是阴影的。

该代码永远不会输出这些语句,这里是Sun的一个例子,应该解释一下:

  public class ShadowTest { public int x = 0; class FirstLevel { public int x = 1; void methodInFirstLevel(int x) { System.out.println("x = " + x); System.out.println("this.x = " + this.x); System.out.println("ShadowTest.this.x = " + ShadowTest.this.x); } } public static void main(String... args) { ShadowTest st = new ShadowTest(); ShadowTest.FirstLevel fl = st.new FirstLevel(); fl.methodInFirstLevel(23); } } 

我不确定,你的意思是什么,但是你访问的是一个具有相同名称的类成员,具有相同的名称,如下所示:

 public class A { int a = 10; public void someMethodA() { int a = 5; this.a = 20; //change the member a from 10 to 20 a = 30; // changes the local variable, which is only known in this method to 30 } } 

通常,此模式在构造函数中使用,将params命名为与成员变量相同,例如:

 class Foo { private int bar = 10; private string fooBar = 20; public Foo(int bar, string fooBar) { this.bar = bar; this.fooBar = fooBar; } }