51

Java のデフォルト コンストラクタと継承について質問があります。

一般に、クラスを作成し、コンストラクターを含めない場合、Java は自動的にデフォルト コンストラクター (パラメーターのないコンストラクター) を提供します。このコンストラクターは、クラスのすべてのインスタンス変数 (存在する場合) をいくつかのデフォルト値 (0、null) で初期化します。 、または false)。ただし、いくつかのパラメーターを使用してコンストラクターを記述し、デフォルトのコンストラクターを記述しない場合、Java はデフォルトのコンストラクターを提供しません。私の質問は次のとおりです。他のクラスから継承するクラスの場合はどうなりますか?いくつかのパラメーターを含むコンストラクターを記述し、デフォルトのコンストラクターを含めない場合、それらはスーパークラスのデフォルトのコンストラクターを継承しますか?

4

11 に答える 11

63
  1. コンストラクターを作成しない場合、デフォルトの空のコンストラクターが自動的に作成されます。

  2. コンストラクターが明示的にスーパーまたはこのコンストラクターを最初のステートメントとして呼び出さない場合、super() への呼び出しが自動的に追加されます。

いつも。

于 2009-02-09T03:38:14.807 に答える
52

コンストラクターは継承されません。

また、フィールドの初期化は、デフォルトのコンストラクターではなく、仮想マシンによって行われます。デフォルトのコンストラクターはスーパークラスのデフォルトのコンストラクターを呼び出すだけで、Object のデフォルトのコンストラクターは空です。この設計の良い点は、初期化されていないフィールドにアクセスする方法がないことです。

于 2009-02-08T11:17:28.693 に答える
11

super(...) を使用しない限り、コンストラクターはその親の空のコンストラクターを呼び出します。注: これは、Object を拡張するクラスであっても、すべてのクラスで行われます。

これは継承ではなく、サブクラスは同じ引数を持つ同じコンストラクターを取得しません。ただし、スーパー クラスのコンストラクターの 1 つを呼び出すコンストラクターを追加できます。

于 2009-02-08T11:18:28.770 に答える
6

基本的なルールは、コンストラクターの呼び出し(または呼び出し)は、JVMが実行する必要のある最初のステートメントである必要があります。

したがって、パラメーター化されたコンストラクターのみがあり、デフォルトのコンストラクターがないスーパークラスがあり、基本クラスにスーパークラスのパラメーター化されたコンストラクターへの明示的な呼び出しがない場合、JVMはsuper()を提供します。スーパークラスのデフォルトコンストラクターがないためエラーをスローする呼び出し。したがって、スーパークラスにデフォルトコンストラクターを提供するか、基本クラスコンストラクターでスーパークラスのパラメーター化されたコンストラクターを明示的に呼び出します。明示的な呼び出しを行うと、JVMはわざわざ行super()を配置しません。コンストラクターの呼び出しはメソッドの最初のステートメントである必要があるため、これは発生しません(明示的な呼び出しのため)。

于 2012-11-29T18:49:47.957 に答える
6

Java 言語仕様のセクション 8.8.9 では、何が起こっているかを詳しく説明しています。

クラスにコンストラクタ宣言が含まれていない場合、デフォルトのコンストラクタが暗黙的に宣言されます。トップ レベル クラス、メンバー クラス、またはローカル クラスの既定のコンストラクターの形式は次のとおりです。

  • デフォルトのコンストラクターには、クラスと同じアクセシビリティーがあります (§6.6)。
  • 既定のコンストラクターには、非プライベートの内部メンバー クラスを除いて、形式的なパラメーターはありません。ただし、既定のコンストラクターは、クラスのすぐ外側のインスタンスを表す 1 つの形式的なパラメーターを暗黙的に宣言します (§8.8.1、§15.9.2、§15.9.3)。 )。
  • デフォルトのコンストラクターには throws 句がありません。
  • 宣言されているクラスが基本クラスの Object である場合、デフォルトのコンストラクターは空の本体を持ちます。それ以外の場合、デフォルト コンストラクターは引数なしでスーパークラス コンストラクターを呼び出すだけです。

ここでは継承が行われていないことがわかります。必要なのは、暗黙的に宣言されたデフォルト コンストラクターによる「コンパイラ マジック」だけです。この仕様では、クラスにコンストラクターがまったくない場合にのみデフォルトのコンストラクターが追加されることも明確にしています。つまり、質問に対する答えは「いいえ」です。スーパークラスが失われます。

于 2015-02-13T15:37:28.607 に答える
3

コンストラクターを指定すると、Java はデフォルトの空のコンストラクターを生成しません。したがって、派生クラスはコンストラクターのみを呼び出すことができます。

デフォルト コンストラクターは、プライベート変数をデフォルト値に初期化しません。その証拠は、既定のコンストラクターを持たず、そのプライベート メンバーが既定値に初期化されたクラスを作成できることです。次に例を示します。

public class Test {

    public String s;
    public int i;

    public Test(String s, int i) {
        this.s = s;
        this.i = i;
    }

    public Test(boolean b) {
        // Empty on purpose!
    }

    public String toString() {
        return "Test (s = " + this.s + ", i = " +  this.i + ")";
    }

    public static void main (String [] args) {
        Test test_empty = new Test(true);
        Test test_full = new Test("string", 42);
        System.out.println("Test empty:" + test_empty);
        System.out.println("Test full:"  + test_full);
    }
}
于 2009-02-08T11:25:48.910 に答える
2

サムルールでは、サブクラスは基本クラスからコンストラクターを呼び出す必要があります。したがって、デフォルトのconstがない場合は、サブクラスから既存のconstを呼び出します。それ以外の場合は、コンパイルの問題を回避するために、基本クラスに空のconstを実装します

于 2011-06-23T11:22:01.277 に答える
1

コンストラクターを作成しない場合、Java はデフォルトのコンストラクターを自動的に作成します。しかし、引数を持つ 1 つ以上のカスタム コンストラクターを作成する場合、Java は既定のコンストラクターを作成しません。1 つ以上のコンストラクターを作成し、コンストラクター引数なしでオブジェクトを作成する場合は、空のコンストラクターを宣言する必要があります。

于 2011-01-26T09:46:27.013 に答える