2017-07-18 11 views
4

私はJavaで内部クラスと外部クラスを学習しています。内クラスと外クラスが何で、なぜそれらが使われているのか分かります。私はこのトピックに関する次の質問に出くわし、答えを見つけることができませんでした。内部クラスを継承するサブクラスのコンストラクタを定義する方法は?

は、次のコードが指定されていると仮定します

class outer{ 
    class inner{ 

    } 
} 

class SubClass extends outer.inner{ 
} 

質問:はどのように最小限のサブクラスのコンストラクタを定義する必要がありますか?なぜ?

Option 1- 
Subclass() { 
    //reason: bacause the default constructor must always be provided 
} 
Option 2- 
Subclass (Outer outer) { 
    //reason : because creating an instance of **Subclass** requires an instance 
    //of outer, which the **Subclass** instance will be bound to 
} 

Option 3- 
Subclass (Outer outer) { 
    outer.super(); 
    //reason : because creating an instance of **Subclass** requires an explicit 
    //call to the **Outer's** constructor, in order to have an enclosing instance 
    //of **Outer** in scope. 
} 
Option 4- 
Subclass (Outer.inner inner) { 
    //reason : bacause an instance of **inner** is necessary so that there is a 
    //source to copy the derived properties from 
} 

PS。これは多項選択問題です。唯一の1の回答が

期待されている私は、Javaに新しいですし、ここで

おかげ

+0

、これは[受信パラメータの場合であること - JLS位8.4.1](http://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.4.1)を参照してください。 – EJP

答えて

2

はこの同じロジックに従うJLSからではなく渡していないことにより、例えば、あるこれらの高度なトピックについて多くを知りませんインスタンスを囲みますが、コンストラクタで直接作成することによって実現できます。

例8.8.7.1-1。適格スーパークラスのコンストラクタ呼び出し

class Outer { 
    class Inner {} 
} 
class ChildOfInner extends Outer.Inner { 
    ChildOfInner() { (new Outer()).super(); } 
} 

スーパークラスのコンストラクタ呼び出しが細分することができる。

  • 修飾されていないスーパークラスのコンストラクタ呼び出しをキーワードsuper (おそらく、明示的な型の引数で始まる)で始まります。

  • 修飾スーパークラスコンストラクタ呼び出しは、プライマリ の式で始まります。

彼らは、サブクラスのコンストラクタを明示的に 直接スーパークラス(8.1.3)に関して、新たに 作成されたオブジェクトの直接囲むインスタンスを指定することができます。これは、スーパークラス が内部クラスである場合に必要になる場合があります。

提案回答に最も近い場合は

public SubClass(Outer outer) { 
    outer.super(); 
} 

Outerの内部クラスは、​​コンストラクタが封入型でOuterのインスタンスを有することが必要であるOuter.Innerを拡張することです。

outer.super();は、InnerコンストラクタであるOuter親クラスのコンストラクタを呼び出します。我々は、一般super()コンストラクタのパラメータには呼び出さないよう

outer.super();構文が当惑してもよいが、内部クラスを拡張するクラスの場合には、サブクラスのコンストラクタは、この構文を可能にします。

+0

'outer.super()'はコンパイルされません... –

+0

@宮本宇佐美私はちょうど試しました。できます。 – davidxxx

+0

あなたのクラス 'Outer'は' super() 'というメソッドを持っていますか?そうでないかぎり、 'super'はスーパークラスのコンストラクタの呼び出しに予約されている予約語(言語構造)であり、クラスまたはインスタンス識別子で修飾することはできません。 –

0

「外側の」クラスが内部クラスを拡張できるとは思いません。その構造は、クラスが別のクラスのプライベートメンバーにアクセスできることを意味します。

同じ外部クラスの別の内部クラスを拡張する内部クラスを持つことができます。

コンストラクタとして、外側インスタンスがインスタンスではなく、引数として指定されている:私は上記のどれを信じていない

class Outer { 
    class Inner { 
     ... 
    } 
    class SubInner { 
     ... 
    } 
    void method() { 
     Inner i = this.new SubInner(); 
    } 
} 
関連する問題