173

デフォルトのコンストラクターとは正確には何ですか—次のどれがデフォルトのコンストラクターであり、他のコンストラクターと何が違うのか教えていただけますか?

public Module() {
   this.name = "";
   this.credits = 0;
   this.hours = 0;
}

public Module(String name, int credits, int hours) {
   this.name = name;
   this.credits = credits;
   this.hours = hours;
}
4

13 に答える 13

281

どっちもない。あなたがそれを定義するならば、それはデフォルトではありません。

デフォルトのコンストラクターは、別のコンストラクターを定義しない限り、自動的に生成される引数なしのコンストラクターです。初期化されていないフィールドはすべてデフォルト値に設定されます。Stringあなたの例では、型が、、でintありint、クラス自体がパブリックであると仮定すると、次のようになります。

public Module()
{
  super();
  this.name = null;
  this.credits = 0;
  this.hours = 0;
}

これはまったく同じです

public Module()
{}

そして、コンストラクターがまったくないのとまったく同じです。ただし、少なくとも1つのコンストラクターを定義すると、デフォルトのコンストラクターは生成されません。

参照:Java言語仕様

クラスにコンストラクター宣言が含まれていない場合、仮パラメーターもthrows節もないデフォルトのコンストラクターが暗黙的に宣言されます。

明確化

技術的には、フィールドをデフォルトで初期化するのはコンストラクター(デフォルトまたはその他)ではありません。しかし、私はそれに答えを残しています。

  • 質問のデフォルトが間違っていて、
  • コンストラクターは、含まれているかどうかに関係なく、まったく同じ効果があります。
于 2010-12-20T10:29:05.920 に答える
38

クラスでコンストラクターを定義しない場合、デフォルトのコンストラクターが作成されます。これは、何もしない引数なし​​のコンストラクターです。編集:super()の呼び出しを除く

public Module(){
}
于 2010-12-20T10:27:27.777 に答える
22

クラスで少なくとも1つのコンストラクターを明示的に定義しない場合、デフォルトのコンストラクターはコンパイラーによって自動的に生成されます。2つ定義したので、クラスにはデフォルトのコンストラクターがありません。

Java言語仕様第3版による

8.8.9デフォルトコンストラクタ

クラスにコンストラクター宣言が含まれていない場合、パラメーターを受け取らないデフォルトのコンストラクターが自動的に提供されます...

于 2010-12-20T10:50:07.500 に答える
18

やあ。私の知識によると、デフォルトのコンストラクターの概念を明確にしましょう。

コンパイラーは、コンストラクターのないクラスに対して、引数のないデフォルトのコンストラクターを自動的に提供します。このデフォルトのコンストラクターは、スーパークラスの引数なしのコンストラクターを呼び出します。この状況では、スーパークラスに引数のないコンストラクターがない場合、コンパイラーは文句を言うので、引数のないコンストラクターがあることを確認する必要があります。クラスに明示的なスーパークラスがない場合は、引数のないコンストラクターを持つObjectの暗黙的なスーパークラスがあります。

この情報は、 Javaチュートリアルから読みました。

于 2013-12-11T11:28:18.413 に答える
7

Javaは、明示的なコンストラクターが提供されていない場合に、引数をとらず、特別なアクションや初期化を実行しないデフォルトのコンストラクターを提供します。

暗黙のデフォルトコンストラクターによって実行される唯一のアクションは、super()呼び出しを使用してスーパークラスコンストラクターを呼び出すことです。コンストラクター引数は、オブジェクトの初期化のためのパラメーターを提供する方法を提供します。

以下は、2つのコンストラクターを含むキューブクラスの例です。(1つのデフォルトと1つのパラメーター化されたコンストラクター)。

public class Cube1 {
    int length;
    int breadth;
    int height;
    public int getVolume() {
        return (length * breadth * height);
    }

    Cube1() {
        length = 10;
        breadth = 10;
        height = 10;
    }

    Cube1(int l, int b, int h) {
        length = l;
        breadth = b;
        height = h;
    }

    public static void main(String[] args) {
        Cube1 cubeObj1, cubeObj2;
        cubeObj1 = new Cube1();
        cubeObj2 = new Cube1(10, 20, 30);
        System.out.println("Volume of Cube1 is : " + cubeObj1.getVolume());
        System.out.println("Volume of Cube1 is : " + cubeObj2.getVolume());
    }
}
于 2012-08-17T09:42:01.623 に答える
6

一般的な用語では、オブジェクトにコンストラクターを指定しない場合、デフォルトのコンストラクターと呼ばれる引数のないコンストラクターが自動的に配置されます。

コンストラクターを指定しない場合に配置されるコンストラクターと同じコンストラクターを定義する場合、一般に引数なしのコンストラクターと呼ばれます。一部のプログラマーは、この明示的に定義された引数なしのコンストラクターをデフォルトのコンストラクターと呼ぶことを好みますが、単なる慣例です。しかし、名前を付けて行く場合、それがデフォルトにならないよりも明示的に定義している場合。

ドキュメントによると

クラスにコンストラクター宣言が含まれていない場合、仮パラメーターもthrows節もないデフォルトのコンストラクターが暗黙的に宣言されます。

public class Dog
{
}

次のように(デフォルトのコンストラクターを追加することにより)自動的に変更されます

public class Dog{
    public Dog() {

    }
} 

そしてあなたがそれを作成するときそれはオブジェクトです

 Dog myDog = new Dog();

このデフォルトのコンストラクターが呼び出されます。

于 2013-09-12T14:25:01.563 に答える
4

デフォルトのコンストラクターとは、プログラマーが定義したコンストラクターがない場合にコンパイラーによって自動的に生成されるコンストラクターを指します。

プログラマーによって提供されたコンストラクターがない場合、コンパイラーは、を呼び出すデフォルトのコンストラクターを暗黙的に宣言します。これにはsuper()、throws節も、仮パ​​ラメーターもありません。

例えば

class Klass {
      // Default Constructor gets generated
} 

new Klass();  // Correct
-------------------------------------

class KlassParameterized {

    KlassParameterized ( String str ) {   //// Parameterized Constructor
        // do Something
    }
} 

new KlassParameterized(); //// Wrong  - you need to explicitly provide no-arg constructor. The compiler now never declares default one.


--------------------------------

class KlassCorrected {

    KlassCorrected (){    // No-arg Constructor
       /// Safe to Invoke
    }
    KlassCorrected ( String str ) {   //// Parameterized Constructor
        // do Something
    }
} 

new KlassCorrected();    /// RIGHT  -- you can instantiate
于 2017-04-28T21:37:10.247 に答える
3

クラスにプログラマーが提供するコンストラクターがない場合、Javaコンパイラーはパラメーターなしのデフォルトコンストラクターを追加し、super()呼び出しで内部的にスーパークラスコンストラクターを呼び出します。これはデフォルトのコンストラクターと呼ばれます。

あなたの場合、プログラムで追加しているので、デフォルトのコンストラクターはありません。追加されたコンストラクターがない場合、コンパイラーによって生成されたデフォルトのコンストラクターは次のようになります。

public Module()
{
   super();
}

:デフォルトのコンストラクターでは、スーパークラスコンストラクターを呼び出すためにsuper()呼び出しも追加されます。

デフォルトのコンストラクターを追加する目的:

コンストラクターの義務は、インスタンス変数を初期化することです。インスタンス変数がない場合は、クラスからコンストラクターを削除することを選択できます。ただし、クラスを継承する場合は、スーパークラスコンストラクターを呼び出して、スーパークラスがすべてのインスタンス変数を適切に初期化するようにするのはクラスの責任です。

そのため、コンストラクターがない場合、Javaコンパイラーはデフォルトのコンストラクターを追加し、スーパークラスのコンストラクターを呼び出します。

于 2013-12-13T10:09:49.470 に答える
2

クラスのコンストラクターを明示的に定義しない場合、javaはクラスのデフォルトコンストラクターを作成します。これは本質的にパラメーター化されていないコンストラクターです。つまり、引数を受け入れません。

デフォルトのコンストラクターの仕事は、スーパークラスコンストラクターを呼び出し、すべてのインスタンス変数を初期化することです。スーパークラスコンストラクターが存在しない場合は、インスタンス変数を自動的にゼロに初期化します。つまり、これはコンストラクターを使用する目的に役立ちます。コンストラクターは、オブジェクトの内部状態を初期化して、インスタンスを作成するコードが完全に初期化された使用可能なオブジェクトを持つようにすることです。

クラスに独自のコンストラクターを定義すると、デフォルトのコンストラクターは使用されなくなります。したがって、どちらも実際にはデフォルトのコンストラクターではありません。

于 2016-06-21T07:43:30.957 に答える
0

クラスでコンストラクターを定義しない場合、コンパイラーはデフォルトのコンストラクターを定義しますが、コンストラクターを宣言する場合(この例では、パラメーター化されたコンストラクターを既に定義しています)、コンパイラーはそれを行いません。

クラスコードでコンストラクターを定義したため、コンパイラーはデフォルトのコンストラクターを作成しませんでした。オブジェクトの作成中に、クラスコードに存在しないデフォルトのオブジェクトを呼び出します。次に、コードはコンパイルエラーを出します。

于 2020-02-18T12:48:56.267 に答える
0

新しいModuleオブジェクトを作成すると、コンストラクターがまったくないため、Javaコンパイラーがデフォルトのコンストラクターを追加します。

class Module{} // you will never see the default constructor

引数以外のコンストラクターを追加する場合は、Javaのものよりも独自のコンストラクターがあり、デフォルトのコンストラクターは追加しません。

これは非引数のコンストラクターであり、親クラスがない場合でも、親クラスからsuper()コンストラクターを内部的に呼び出します。(クラスにObject.Classコンストラクターよりも親クラスがない場合は呼び出されます)

    class Module{

        Module() {} // this look like a default constructor but in not. 
    }
于 2020-04-29T12:42:59.473 に答える
-1

デフォルトのコンストラクターは引数を取りません。

public class Student { 
    // default constructor
    public Student() {   

    }
}
于 2010-12-20T10:34:07.290 に答える
-3

どちらがデフォルトのコンストラクターであるかについて、あなたが答えを得たことを願っています。しかし、私は与えられたコメントを訂正するために以下のステートメントを与えています。

  • Javaは、ローカル変数をデフォルト値に初期化しません。したがって、クラスのオブジェクトを作成する場合、デフォルトのコンストラクターが呼び出され、オブジェクトにデフォルト値が提供されます。

  • デフォルトコンストラクタは、タイプに応じて、0、nullなどのデフォルト値をオブジェクトに提供します。

詳細については、以下のリンクを参照してください。

https://www.javatpoint.com/constructor

于 2017-10-31T16:38:01.390 に答える