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

时间:2014-01-18 07:33:01

标签: java oop scope

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

    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

       }
      }
    }
   }

3 个答案:

答案 0 :(得分: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);
    }
}

答案 1 :(得分:1)

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

  

局部变量(§14.4),形式参数(§8.4.1),异常参数(§14.20)和本地类(§14.3)只能使用简单名称(§6.2)来引用,而不是限定名称(§6.6)。

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

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

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

答案 2 :(得分: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;
    }
}