web-dev-qa-db-ja.com

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

デフォルトコンストラクタとは正確には何ですか - 次のうちどれがデフォルトコンストラクタであり、それが他のコンストラクタとどのように異なるのかを教えてください。

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;
}
143
antanis

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

デフォルトのコンストラクタは、別のコンストラクタを定義しない限り、自動的に生成される引数なしのコンストラクタです。未初期化フィールドはすべてデフォルト値に設定されます。たとえば、型がStringint、およびintであり、クラス自体がpublicであると仮定すると、このようになります。

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

これはまったく同じです。

public Module()
{}

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

参照: Java言語仕様

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

明確化

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

  • 質問のデフォルトが間違っています
  • 含まれていてもいなくても、コンストラクターはまったく同じ効果を持ちます。
232
OrangeDog

クラスにコンストラクタを定義していない場合は、デフォルトのコンストラクタが作成されます。それは単に何もしない引数のないコンストラクタです。編集:call super()を除く

public Module(){
}
31
Jim

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

PerJava言語仕様第3版

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

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

19
kem

こんにちは。私の知る限りでは、デフォルトコンストラクタの概念を明確にしておきます。

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

この情報は Java Tutorials から読みました。

17
Koushik85

明示的なコンストラクタが提供されていない場合、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());
    }
}
7
sunil

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

何も提供しない場合に配置されるものと同じコンストラクタを定義する場合、それは一般に引数なしコンストラクタと呼ばれます。ただし、この明示的に定義された引数なしコンストラクタをデフォルトコンストラクタと呼ぶ人もいます。しかし、明示的に定義しているのであれば、それをデフォルトにしていないのであれば、命名を続けます。

docs に従って

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

public class Dog
{
}

次のように(デフォルトコンストラクタを追加することで)自動的に修正されます。

public class Dog{
    public Dog() {

    }
} 

そしてあなたがそれを作成するとき

 Dog myDog = new Dog();

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

6
Aniket Thakur

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

プログラマが提供するコンストラクタがない場合、コンパイラは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
3
Yergalem

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

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

public Module()
{
   super();
}

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

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

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

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

2
user1923551

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

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

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

1
uttsav

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

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

    }
}
0
user467871