2015-09-09 3 views
1

В настоящее время я занимаюсь учебником вложенных классов от Oracle, а в части Shadowing у меня есть то, что я вообще не понимаю.Внутренняя переменная переменной экземпляра класса

Код второй строки исполнения methodInFirstLevel, выводящий значение this.x, но в основном методе, который мы уже передали в аргументе 23 параметру метода для нового экземпляра объекта. Так почему же это int x от FirstLevel еще до 1? Должно ли ключевое слово this ссылаться на экземпляр объекта?

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 f1 = st.new FirstLevel(); 
    f1.methodInFirstLevel(23); 
} 

} 

Выход:

x = 23 
this.x = 1 
ShadowTest.this.x = 0 
+4

Почему вы ожидаете 'this.x' быть' 23'? Нет, где в 'methodInFirstLevel' вы присваиваете' this.x = x'; – user2718281

+1

Здесь есть три результата (которые вы не указали - пожалуйста, отредактируйте код с образцом вывода) - мне совершенно не ясно, какую строку вывода вы путаете. 'this.x' относится к' FirstLevel.x', поэтому имеет значение 1. 'ShadowTest.this.x' относится к' x' в экземпляре 'ShadowTest', поэтому оно равно 0. –

+0

@ user2341963 спасибо mate now Я знаю, что моя ошибка приветствует. – Scorpiorian83

ответ

0

Престижность user2341963 тогда я понял свою небрежность за пропускаете, что не один конструктор не предусмотрено предложить this.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); 
    } 

параметр й не был назначен this.x или ShadowTest.this.x, , таким образом, оба значения остаются неизменными.

изменить this.x значение 23, вы должны установить его как

this.x =x; 
1

Вы не назначите x значение this.x другим мудрым он будет держать его значение, как это.

Я думаю, что следующий пример поможет вам понять области внутри обычных внутренних классов.

class OuterSuper{ 
    int a=100; 
} 
class InnerSuper{ 
    int a=200; 
} 
class Outer extends OuterSuper{ 
    int a=300; 

    void mOuter(){ 
     System.out.println("mOuter.."); 
    } 
    class Inner extends InnerSuper{ 
     int a=400; 

     void mInner(){ 
      int a=500; 
      System.out.println("mInner.."); 
      System.out.println("Local a :"+a); // This will access the scope within mInner() method  
      System.out.println("Inner a :"+this.a); // This will access the scope of Inner class 
      System.out.println("Outer a :"+Outer.this.a); // This will access outer class scope 
      System.out.println("Inner Super a :"+super.a); // this will access super class of inner 
      System.out.println("Outer Super a :"+Outer.super.a); // this will access super class of outer 
     } 
    } 
} 

class Demo{ 
    public static void main(String args[]){ 
     Outer.Inner iob=new Outer().new Inner(); 
     iob.mInner(); 

    } 
}