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);
}
}
}
このコードは4つの異なる値を示す
0
1
2
3
印刷されます。 inner
インスタンスの
- 親初期化されない
x
変数があります。何が起こっている は次のとおりです。 int
の場合、デフォルト値は0です。これはsuper.x
です。
- メソッド
f
は、引数1
で呼び出されます。これはx
です。
- インスタンス
inner
は、x
をinner.x = 2
で2に設定しました。これはthis.x
です。
- の
outer
インスタンスは、x
の値を3に設定しました。これはOuter.this.x
です。ここで
トリックInner
の両方であることであるinner class(それは封入Outer
インスタンス有する)とを(それは親Outer
インスタンスを有する)、及びこれら二つOuter
インスタンスが同じではありません。
Bleaaah、コードの混乱。しかし、「Outer.this.x」と「super.x」を区別するために、4つめの方に傾いています。これは、スーパータイプと囲みタイプの両方に「外」があり、それらが異なるためです。 –
修正します。'外側=新しい外側();インナーb = a.newインナー(); 'が4つあります。 –
いくつかの構文形式 - Inner.super.x'、((Outer)this).x' – ZhongYu