2017-08-31 6 views
1
class Super 
{ 
    Super() 
    { 
     System.out.println("This is Super Constructor"); 
    } 
} 
class Sub extends Super 
{ 
    Sub() 
    { 
     //super() is automatically added by the compiler here! 
     System.out.println("This is Sub Constructor"); 
     //super(); I can't define it here coz it needs to be the first statement! 
    } 
} 
class Test 
{ 
    public static void main(String...args) 
    { 
     Sub s2=new Sub(); 
    } 
} 

出力:
これでスーパーコンストラクタ
これはとにかくサブコンストラクタスーパークラスのコンストラクタの前にSubクラスのコンストラクタを実行するためにJAVAには何かがありますか?

がそうするのですか?
Super()の前にSub()にアクセスすることはできませんか?
スーパークラスまたは継承クラスが最初に初期化され、次にサブクラスが初期化されていることを知っています。

+0

これを行う必要がある場合は、あなたのオブジェクトモデルを確認する必要があります。そのような場合は、親子関係を誤って使用している可能性があります。 – Amit

答えて

0

簡単な答えです。 継承の概念は約IS-Aの関係です。 技術的には、DogクラスはAnimalクラスの子です。 。 。 は、オブジェクトを作成すると、Dogクラスは、それがDOG

として分類される前に...最初ANIMALで、これは物事をclearifies願っています。 。あなたが尋ねたようにそれをすることはできません

2

コンストラクタでは、この呼び出しを自分で提供していない場合、コンパイラは常にsuper() の呼び出しを追加します。

あなたが逆コンパイラで見れば、あなたのサブコンストラクタは次のようになります。

Sub() 
{ 
    super(); 
    System.out.println("This is Sub Constructor"); 
} 

はありませんので、それは不可能です。

0

これは、常にベースクラスコンストラクター(親)を最初に呼び出し、次に開始クラス(子)を呼び出します。あなたの場合はsuper()が最初に実行されます。

良い読み物:他の回答としてWhich executed first, The parent or the child constructor?

0

は可能ではないと言います。なぜあなたはこれをやろうとしているのか分かりませんが、継承されたフィールドが最初に初期化されるように、子クラス実装がそれに依存する可能性があるので、実装をよりよく再考してください。

+0

ようこそスタックオーバーフロー!この回答では、まだ他の回答には提供されておらず、詳細が少ない新しい情報は追加されません。役に立たない回答を投稿してください – Milk

0

このように、スーパーコンストラクタは常に呼び出されます。たぶん、あなたはあなたの質問を書き直し、説明する必要があります。

関連する問題