2016-01-12 1 views
26

これは、Javaの内部クラスの動作を理解するためのトレーニングです。質問によれば、(*)にはどのくらい多くの異なるバージョンのxがありますか?(*)でアクセスできる 'x'のバージョンはいくつですか?

class Outer { 
    int x; 

    class Inner extends Outer { 
     int x; 

     void f(int x) { 
      (*) 
     } 
    } 
} 

私は、すなわち3があることを考えるに傾いている:this.xsuper.xxが、私の同僚のいくつかは混乱している私たちの4

があることを考えているようですか?あなたは説明できますか?

+16

Bleaaah、コードの混乱。しかし、「Outer.this.x」と「super.x」を区別するために、4つめの方に傾いています。これは、スーパータイプと囲みタイプの両方に「外」があり、それらが異なるためです。 –

+1

修正します。'外側=新しい外側();インナーb = a.newインナー(); 'が4つあります。 –

+0

いくつかの構文形式 - Inner.super.x'、((Outer)this).x' – ZhongYu

答えて

30

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インスタンスの

  1. 親初期化されないx変数があります。何が起こっている

    は次のとおりです。 intの場合、デフォルト値は0です。これはsuper.xです。

  2. メソッドfは、引数1で呼び出されます。これはxです。
  3. インスタンスinnerは、xinner.x = 2で2に設定しました。これはthis.xです。
  4. outerインスタンスは、xの値を3に設定しました。これはOuter.this.xです。ここで

トリックInnerの両方であることであるinner class(それは封入Outerインスタンス有する)と​​を(それは親Outerインスタンスを有する)、及びこれら二つOuterインスタンスが同じではありません。

+0

Re: "[サブクラス](https://docs.oracle.com/javase/specs/jls/se8) /html/jls-8.html#jls-8.1.4)(これには親の 'Outer'インスタンスがあります):これは" a [subclass](https://docs.oracle.com/javase/specs /jls/se8/html/jls-8.html#jls-8.1.4)(それ自体が 'Outer'インスタンスです)。 (または、むしろ "a [サブクラス](https://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.1.4)(インスタンス自体は'アウター'インスタンス ')。) – ruakh

10

それらの4があります。

  • Outer.this.xOuterクラスのプロパティに
  • this.xInnerクラスのプロパティの
  • super.xスーパータイプOuterクラスのプロパティの
  • xメソッドの引数に
関連する問題