4

私はこのプログラムを持っています:

public class A
{
    public A(){
    System.out.println("I am in A");
    }

    public static void main(String args[]){
    B a = new B("Test");
    }
}

class B extends A
{   
    public B(){
    System.out.println("I am in B");
    }

    public B(String s){
    this();
    super();
    System.out.println("I am in B as " + s);
    }
}

thisでは、のコンストラクターBを呼び出してデフォルトのコンストラクターを呼び出せないのはなぜですか?これにより、コンパイル時エラーが発生します。

4

4 に答える 4

4

thisコンストラクターの最初の行でsuperなければなりません。

編集:

言語仕様

8.8.7. コンストラクタ本体

コンストラクター本体の最初のステートメントは、同じクラスまたは直接のスーパークラス (§8.8.7.1) の別のコンストラクターの明示的な呼び出しである場合があります。

于 2012-06-06T18:33:34.620 に答える
1

this()同じクラスの別のコンストラクターを呼び出します。

super()スーパーコンストラクターを呼び出します。 nosuper()が明示的に記述されている場合、コンパイラーは暗黙的にスーパーコンストラクターを追加します。super()したがって、 2回電話をかけることになります。

したがって、両方は許可されません。


編集

あなたのコードの文脈では: 覚えておいてください,super()は常にコンストラクターの最初の行でなければなりません.

于 2012-06-06T18:27:29.380 に答える
1

さらに熟考すると、以下の私の答えは基本的に正しいですが、ニュアンスが欠けています。基本的に、スーパー コンストラクターは 1 回呼び出すことができます。これは、スーパークラスが一度だけ構築されるようにするためです。これは、特定のコンストラクターの最初の行が、現在のクラス内の別のコンストラクターへの呼び出しまたはスーパークラス内のコンストラクターへの呼び出しである可能性があることを意味します。これは、任意のコンストラクターで別のコンストラクターを 1 回しか呼び出せないことも意味します。現在のクラスまたはスーパー クラスで呼び出すことを選択する必要があります。これにより、現在のオブジェクトが構築される前に、すべてのスーパークラスが完全に構築されます。

古い説明:

基本的な理由は、サブクラスを構築する前にすべてのスーパークラスを構築する必要があるためです。この目的のために、コンストラクターの最初の行にそのような呼び出しが存在しない場合、Java は暗黙的に super() を呼び出します。この動作をオーバーライドする唯一の方法は、スーパー クラスで別のコンストラクターを明示的に呼び出すことです。基本的に、Java はユーザーを作成する前に階層を作成する必要があります。

コンストラクターを最初に配置することは、この要件に違反するため、違法です。

于 2012-06-06T18:31:27.117 に答える
0

Java によれば、this() と super() はコンストラクターの最初のステートメントである必要があります。要点は、最初の行として両方を一度に書くことはできないということです。暗黙的に呼び出されます。それはそれと同じくらい簡単です.Uには、それらを単一のコンストラクター本体に一緒に書き込むオプションはありません

于 2013-06-27T17:17:01.897 に答える