40

スーパークラスからサブクラスにコンストラクターを継承する方法は?

4

6 に答える 6

49

コンストラクターは継承されません。スーパークラス内の対応するコンストラクターにマップされるサブクラス内に、同じようにプロトタイプ化された新しいコンストラクターを作成する必要があります。

これがどのように機能するかの例を次に示します。

class Foo {
    Foo(String str) { }
}

class Bar extends Foo {
    Bar(String str) {
        // Here I am explicitly calling the superclass 
        // constructor - since constructors are not inherited
        // you must chain them like this.
        super(str);
    }
}
于 2010-02-23T16:26:22.237 に答える
14

スーパークラス コンストラクターは、拡張クラスで継承できません。ただし、最初のステートメントとして super() を使用して、拡張クラス コンストラクターで呼び出すことができます。

于 2012-09-08T07:21:06.767 に答える
7

デフォルトのコンストラクター(引数(宣言または暗黙)のないパブリックコンストラクター)は、デフォルトで継承されます。この例として、次のコードを試すことができます。

public class CtorTest {
    public static void main(String[] args) {
        final Sub sub = new Sub();
        System.err.println("Finished.");
    }

    private static class Base {
        public Base() {
            System.err.println("In Base ctor");
        }
    }

    private static class Sub extends Base {
        public Sub() {
            System.err.println("In Sub ctor");
        }
    }
}

スーパークラスからコンストラクターを明示的に呼び出したい場合は、次のようにする必要があります。

public class Ctor2Test {
    public static void main(String[] args) {
        final Sub sub = new Sub();
        System.err.println("Finished.");
    }

    private static class Base {
        public Base() {
            System.err.println("In Base ctor");
        }

        public Base(final String toPrint) {
            System.err.println("In Base ctor.  To Print: " + toPrint);
        }
    }

    private static class Sub extends Base {
        public Sub() {
            super("Hello World!");
            System.err.println("In Sub ctor");
        }
    }
}

唯一の注意点は、super()呼び出しがコンストラクターの最初の行として来る必要があることです。そうしないと、コンパイラーが怒ります。

于 2010-02-23T16:35:19.323 に答える
4

super キーワードについて読んでください(サブクラス コンストラクターを下にスクロールします)。あなたの質問が理解できたら、おそらくスーパークラスのコンストラクターを呼び出したいですか?

スーパークラス コンストラクターを明示的に呼び出さない場合、Java コンパイラーは引数なしのコンストラクター呼び出しをスーパークラスに自動的に挿入することに注意してください。

于 2010-02-23T16:26:34.427 に答える
1

あなたが持っているかどうか言ってください

/**
 * 
 */
public KKSSocket(final KKSApp app, final String name) {
    this.app = app;
    this.name = name;
    ...
}

その場合、KKSSocket を拡張する KKSUDPSocket という名前のサブクラスには、次のものがあります。

/**
 * @param app
 * @param path
 * @param remoteAddr
 */
public KKSUDPSocket(KKSApp app, String path, KKSAddress remoteAddr) {
    super(app, path, remoteAddr);
}

/**
 * @param app
 * @param path
 */
public KKSUDPSocket(KKSApp app, String path) {
    super(app, path);
}

スーパークラスへのメソッド呼び出しのように、コンストラクターチェーンに引数を渡すだけですが、スーパークラスコンストラクターを参照して指定された引数を渡す super(...) を使用します。

于 2010-02-23T16:31:49.277 に答える
1

クラス コンストラクターではなく、クラス属性を継承します。次のようになります。

スーパークラスにコンストラクターが追加されていない場合、コンパイラーは引数なしのコンストラクターを追加します。このデフォルト コンストラクタは、サブクラスの新しいインスタンスが作成されるたびに暗黙的に呼び出されます。ここで、サブクラスにはコンストラクターがある場合とない場合がありますが、すべて問題ありません。

コンストラクターがスーパークラスで提供されている場合、コンパイラーはそれが引数なしのコンストラクターかパラメーター付きのコンストラクターかを確認します。

引数がない場合、コンパイラはサブクラスのインスタンス化に対してそれを呼び出します。ここでも、サブクラスにはコンストラクターがある場合とない場合がありますが、すべて問題ありません。

親クラスの 1 つ以上のコンストラクターにパラメーターがあり、args コンストラクターが存在しない場合、サブクラスには少なくとも 1 つのコンストラクターが必要であり、親クラス コンストラクトの暗黙的な呼び出しが super (parent_contractor params) を介して行われます。

このようにして、継承されたクラス属性が常にインスタンス化されることが保証されます。

于 2015-12-21T23:32:45.520 に答える