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

Смежные вопросы