Ответ 1
Есть 4, а именно: x
, this.x
, super.x
и Outer.this.x
.
Рассмотрим следующее:
public class Outer {
int x;
public static void main(String[] args) {
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();
outer.x = 3;
inner.x = 2;
inner.f(1);
}
class Inner extends Outer {
int x;
void f(int x) {
System.out.println(super.x);
System.out.println(x);
System.out.println(this.x);
System.out.println(Outer.this.x);
}
}
}
Этот код напечатает
0
1
2
3
показывает 4 разных значения.
Что происходит:
- Родитель экземпляра
inner
имеет унифицированную переменнуюx
. Дляint
значение по умолчанию равно 0: этоsuper.x
. - Метод
f
вызывается с аргументом1
: этоx
. - У экземпляра
inner
был установлен егоx
to 2 сinner.x = 2
: этоthis.x
. - В экземпляре
outer
, который естьOuter.this
, было установлено его значениеx
равным 3: этоOuter.this.x
.
Трюк здесь в том, что inner
является внутренним классом (поэтому он имеет охватывающий экземпляр outer
) и (поэтому он имеет родительский экземпляр outer
), и те два экземпляра outer
не совпадают.