有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
設置爲2,並且inner.x = 2
:這是this.x
。
outer
實例,即Outer.this
被設置爲x
的值爲3:這是Outer.this.x
。
的這裏訣竅是,Inner
既是inner class(所以它有一個封閉Outer
實例)和一個(所以它有一個父Outer
實例),並且在這兩個Outer
實例是不一樣的。
Bleaaah,代碼亂七八糟。但是我傾向於4,將'Outer.this.x'與'super.x'區分開來,因爲'Outer'既是超類型又是封閉類型,而且這兩者是截然不同的。 –
正確。用'Outer a = new Outer();內部b = a.new內部();''有4個。 –
一些更多的句法形式 - 'Inner.super.x','((Outer)this).x' – ZhongYu