-5
abstract class A {
    abstract void method();
}

class B extends A {
    B() {
    }

    void method() {
    }
}

class C extends B {
    C() {
    }
}

メインでクラス C をインスタンス化すると、B (親クラス) のコンストラクターが自動的に呼び出されます。それは正常ですか、それとも何か間違ったことをしていますか?

4

4 に答える 4

5

何も問題はありませんsuper。コンストラクターへの暗黙の呼び出しがあります。

クラスのコンストラクターを作成していないCため、デフォルトのコンストラクターはコンパイラーによって提供されます。

C(){
  super(); 
 }

デフォルトのコンストラクターが提供されている場合は、 への呼び出しがありますsuper()。あなたの場合、C extends BのコンストラクターBが呼び出されます。

他のクラスでクラスを作成しない場合も、デフォルトでObjectクラスを拡張します。したがって、Objectクラス コンストラクターが呼び出されます。

于 2013-08-24T05:51:17.027 に答える
2

コンストラクター本体が明示的なコンストラクター呼び出しで始まらず、宣言されているコンストラクターが基本クラス Object の一部でない場合、コンストラクター本体はスーパークラス コンストラクター呼び出し "super();" で暗黙的に開始されます。、引数を取らない直接のスーパークラスのコンストラクターの呼び出し。

http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.8.7

于 2013-08-24T05:52:56.530 に答える
1

C をインスタンス化すると、C、B、A、およびオブジェクトのコンストラクター呼び出しが行われます。AC は、直接的または間接的なスーパークラスとして動作できる必要があり、それらすべてのフィールドがあります。クラス X コンストラクターの仕事は、初期化されるオブジェクトを X として機能できるようにすることです。

宣言されたコンストラクターがない場合、コンパイラーはパラメーターなしのコンストラクターを作成するため、すべてのクラスに少なくとも 1 つのコンストラクターがあります。Object コンストラクターではないコンストラクターが "this" または "super" コンストラクター呼び出しで始まらない場合、コンパイラーはそれを "super();" (直接のスーパークラスのパラメーターなしのコンストラクターへの呼び出し) で始まるものとして扱います。

于 2013-08-24T06:04:58.663 に答える
0

Javaの各コンストラクターの最初の行はコンストラクターを呼び出しますsuper。これがJavaの仕組みです。あなたはそれについて読むべきです。

于 2013-08-24T05:51:18.537 に答える