2014-01-18 77 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