3
class A {

    A() {
        System.out.print("A");
    }
}

class B extends A {
     B() {
        System.out.print("B");
    }
}

class C extends B {
 C() {
        System.out.print("C");
    }
}

public class My extends C {
My(){
super();
}
    public static void main(String[] args) {
        My m = new My();
    }
}

質問はインタビューの1つの質問から始まります(Javaでオブジェクトを作成するとどうなりますか?)

そして答えは…

最も派生したクラスのコンストラクターが呼び出されます。コンストラクターが最初に行うことは、そのスーパークラスのコンストラクターを呼び出すことです。java.lang.Object は Java のすべてのオブジェクトの基本クラスであるため、このプロセスは java.lang.Object のコンストラクターが呼び出されるまで続きます。コンストラクターの本体が実行される前に、すべてのインスタンス変数初期化子と初期化ブロックが実行されます。次に、コンストラクターの本体が実行されます。したがって、基本クラスのコンストラクターが最初に完了し、最も派生したクラスのコンストラクターが最後に完了します。

したがって、上記のステートメントによると、答えはABCCである必要がありますが、 ABCのみが表示されます。super()ただし、派生コンストラクターでコメントしている場合。次に、出力はABCです。上記の段落を誤解していましたか、理解するのを手伝ってください。?

4

2 に答える 2

6

いいえ、答えはABCです

My m = new My(); 

上記は最初にクラスを呼び出しMy、次にスーパークラス、つまりCクラスに対してスーパーコールが行わBれ、次にクラスへのスーパーコールが行われ、次にクラスへのスーパーコールが行われ、次にすべてのオブジェクトが拡張するようAにスーパーコールが行われます。java.lang.Objectjava.lang.Object

したがって、答えはABCです。

のようなそのクラスのオーバーロードされたコンストラクターを呼び出さない限り、コンパイラーによって組み込まれるため、クラスで明示的に呼び出す必要はありません。super()Mythis(something)

于 2012-12-10T16:43:55.190 に答える
-3

以下のコードが出力されますABC

スーパークラスのコンストラクターを呼び出すために、コンストラクターを明示的にsuper()呼び出していない場合、コンパイラーはクラスを拡張するすべてのクラスで暗黙的に呼び出しますsuper

于 2012-12-10T16:42:54.257 に答える