2014-01-18 42 views
1

如何访问与内部类的内部类成员实例或方法局部变量具有相同名称的方法变量?方法本地内部类成员范围访问

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 i.e 2 

     } 
     } 
    } 
    } 
+0

该代码将永远不会输出这些语句,但它确实编译 – NimChimpsky

回答

1

不,你不能这样做。原因在于,位于的变量a是一个局部变量,只能在封闭范围内使用它的简单名称进行访问。从JLS §6.4

局部变量(§14.4),形式参数(§8.4.1),异常参数(§14.20),和局部类(§14.3)只能被称为使用简单的名称( §6.2),而不是合格的名称(§6.6)。

现在,这表明您只能访问那个变量只有a。但是,在方法本地类B中存在另一个变量,该变量隐藏位置中的局部变量a,该局部变量在位置处再次被局部变量遮蔽。

现在在打印声明中,a将访问最接近封闭范围的变量,即位置为的局部变量。如果删除该变量,它将在位置上打印变量。然后如果将其删除,它将在位置上打印变量。

所以,重点是,没有办法访问位置本地变量a,因为这是阴影。

+0

好吧,你是对的,因为我试过这段代码,但只是想知道是否有办法做到这一点,因为我是新手,大多数扭曲的问题真的让我发疯,非常感谢。 – Ganymede

0

我不知道,你实际上意味着,但你访问类成员具有相同的名称与同名像这样的局部变量:

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; 
    } 
} 
1

代码永远不会输出这些语句,下面是一个例子from 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); 
    } 
} 
+0

你是什么意思,代码将不会给那些输出?那会给。 –

+0

你的代码是简单的成员内部类,我的代码需要访问方法本地类中的局部变量。 – Ganymede