6

コンストラクターのオーバーライドと非常に混同しています。コンストラクターをオーバーライドできないのは、グーグルで検索したときに得られる結果です私の質問は

public class constructorOverridden {

    public static void main(String args[]) {
        Sub sub = new Sub();
        sub.test();
    }
}

class Super {
    Super() {
        System.out.println("In Super constructor");
        test();
    }

    void test() {
        System.out.println("In Super.test()");
    }
}

class Sub extends Super {
    Sub() {
        System.out.println("In Sub constructor");
    }

    void test() { // overrides test() in Super
        System.out.println("In Sub.test()");
    }
}

これを実行すると、次の結果が得られました

In Super constructor
In Sub.test()
In Sub constructor
In Sub.test()

サブクラスのテストメソッドが実行されることに注意してください。スーパークラスのコンストラクターがオーバーライドされていることを示していますか。それは正しいですか?

4

5 に答える 5

20

コンストラクターはポリモーフィックではありません。まったくオーバーライドしません。サブクラスで新しいコンストラクターを作成すると、各サブクラスのコンストラクターは、スーパークラスのコンストラクターに (おそらく間接的に) 連鎖する必要があります。コンストラクターに明示的にチェーンしない場合、パラメーターなしのスーパークラス コンストラクターへの暗黙的な呼び出しが、サブクラス コンストラクター本体の先頭に挿入されます。

メソッドのオーバーライドに関して言えば、オブジェクトは、スーパークラス コンストラクターの実行時を含め、最初から「最終型」です。したがってgetClass()Superコンストラクター コードをSub出力しても、出力に表示されます。その結果、コンストラクターがまだ実行されていなくても、オーバーライドされたメソッド (つまりSub.test) が呼び出されます。Sub

これは根本的に悪い考えであり、ほとんどの場合、コンストラクターでオーバーライドされる可能性のあるメソッドを呼び出すことを避ける必要があります。適切に初期化されているなど)。

于 2013-02-01T09:42:45.317 に答える
3

コンストラクターの暗黙の最初の行は、 への呼び出しSuper()です。だからこそ、その結果が得られるのです。

于 2013-02-01T09:41:53.797 に答える
2

スーパークラスコンストラクターをオーバーライドしておらず、コンストラクターをオーバーライドできず、オーバーロードできます。

子クラスオブジェクトを作成すると、最初にスーパークラスがインスタンス化され、次にサブクラスがインスタンス化されます。そのように、子は親なしでは存在できません

コンパイラーは、サブクラスのコンストラクターからスーパークラスのコンストラクターを自動的に呼び出します。

Sub() {
    super();
    System.out.println("In Sub constructor");
}
于 2013-02-01T09:44:17.460 に答える