2016-09-05 1 views
0
ない

私は内部クラスからの継承について読んでいたし、私は以下のコードがどのように機能するかを理解しようとして捕まってしまった。それにこのInnerクラスの継承の例はどのように機能しますか?

class Outer{ 
    class Inner{ 
    } 
} 
class Derived extends Outer.Inner{ 
    Derived(Outer o){ 
     o.super(); 
    } 
} 

私の知る限りでは、キーワードsuperはスーパークラスを指し、スーパー()だなし引数のコンストラクタ。 Outerクラスの場合、スーパークラスはObjectクラスです。
私は、このコードがどのように動作するかを理解したいと思います。
Objectクラスのインスタンス化によってInnerクラスの拡張が可能になるのはなぜですか?
Objectクラスインスタンスの作成は、Outerクラスオブジェクトの作成と何が関係していますか?

"o.super();"を含む行を削除します。原因エラー:
java:p.Outer.Innerを含む囲むインスタンスが必要です

私は多くの記事を読んでいますが、どのように動作するのかわかりません。
私はどんな答えにも喜ばれるでしょう。

+0

テストそれを出す。すべてのコンストラクタにprintln()行を入れて、それをプリントアウトする順序を調べます。 ;) – GregaMohorko

+1

実際のプロジェクトでこれを行う場合は、オブジェクト階層を再考することをお勧めします。 –

答えて

2

あなたはOuterのインスタンスを参照する変数oを持って、そしてあなたがその親インスタンスがoの値であるとInnerのインスタンスを作成するとします。 (あなたが内部クラスを作成する場合、通常は、あなたが「これ」という暗黙の親インスタンスでそれを行うので)これはほとんどのJavaに見られないです

Outer.Inner inner = o.new Outer.Inner(); 

、それが有効です:あなたが呼び出すことができます。

これは実際にはそれに相当しますが、サブクラスのコンストラクタのコンテキストでは同じです。それはちょうどそれが構文でそのようにを表明していないのです...

Inner(Outer enclosingInstance) 

...と、この行は効果的

super(o) 

を呼び出すことです: Innerクラス 本当には、このようなコンストラクタを持っていますこの「特別な」情報と任意の通常のパラメータを区別します。

1

Why instantiation of Object class makes extending Inner class possible?

Innerインスタンスでは、Outerインスタンスが内部インスタンスになる必要があります。それはそれが外のインスタンスなしでそれを持つことは理にかなっていません。それは外せずにインナーを持ってしても意味がなかった場合は、それstatic

What creating an Object class instance has to do with creating Outer class object?

なるだろうあなたがインナーインスタンスを作成する前に、外側のインスタンスを必要としています。

I read many articles but I can't figure out how it works.

それはOuterインスタンスにInnerスーパークラスのニーズを設定します。あなたはこのOuter outer = new Outer(); Inner inner = outer.new Inner();

0

このOuter.Inner inner = (new Outer()).new Inner();

あなたの内部クラスがstatic修飾子を使用して宣言された場合、それはこのようなことの新しいインスタンスを初期化するために必要とされるであろう静的な入れ子になったクラスと外部クラスのインスタンス、次のようになります。Outer.Inner inner = new Outer.Inner();

+0

私の質問は答えではありませんが、ありがとうございます。 –

1

クラスInnerのような内部クラスは、ネストされた内部クラスと呼ばれ、それを初期化するためのような外部クラスのインスタンスを使用する必要がされるように、外部クラスにバインドされインスタンス化

関連する問題