実際、引数なしのコンストラクタとデフォルトのコンストラクタの違いは何なのか理解できません。
import javax.swing.*;
public class Test extends JFrame {
public Test() {
super();
this.setSize(200,200);
this.setVisible(true);
}
public static void main(Sting[] arg) {
Test cFrame = new Test();
}
}
これにより、cFrameと呼ばれるTestオブジェクトの作成中にこのクラスのデフォルトコンストラクターが呼び出されますか?
default
コンストラクターは、引数なしのコンストラクターで、Javaコンパイラーがユーザーに代わって挿入します。super();
へのdefault
呼び出しが含まれます。 (supper()
ではありません)これはデフォルトの動作です。コンストラクタを実装すると、デフォルトのコンストラクタは受信されなくなります。
JLS-8.8.9。デフォルトコンストラクタ は(部分的に)言います、
クラスにコンストラクター宣言が含まれていない場合、仮パラメーターとthrows句のないデフォルトコンストラクターが暗黙的に宣言されます。
宣言されているクラスが原始クラスObjectである場合、デフォルトのコンストラクターは空の本体を持ちます。それ以外の場合、デフォルトのコンストラクタは引数なしでスーパークラスコンストラクタを呼び出します。
default constructor
は、明示的なコンストラクターがない場合にJavaコンパイラーがコードに追加するコンストラクターです。デフォルトのコンストラクターは、引数なしでスーパークラスのコンストラクターを呼び出します。
独自のコンストラクターを追加した場合(パラメーターなしでもパラメーター付きでも)、この場合、コンパイラーはデフォルトのコンストラクターを追加しません。
デフォルトコンストラクタとは何ですか?
これは、コンストラクターを定義していない場合にコンパイラーによって追加されるコンストラクターです。
クラスにコンストラクターがある場合、コンパイラーはデフォルトのコンストラクターを追加しません。
あなたの場合、コンストラクターがあります。
public Test(){
super();
this.setSize(200,200);
this.setVisible(true);
}
したがって、JVMによって呼び出されるデフォルトのコンストラクタはありません。
答えはNoです。参照変数cFrameは、デフォルトのコンストラクターではなく、引数ではないコンストラクターTest()を呼び出します。 Test()コンストラクターは、さらにJFrameクラス(Parent)などの非argコンストラクターを検索して呼び出しますが、すべてのクラスには少なくとも1つのコンストラクターが必要です。明示的に宣言されていない場合、Javaコンパイラは、パラメータ化されていないコンストラクタ、つまりデフォルトコンストラクタを提供します。このデフォルトコンストラクタは、親クラスのパラメータ化されていないコンストラクタを呼び出し、クラス変数をデフォルト値に初期化します。
例えば:
Class Base {}
Class Derived extends Base {} // Default constructor of class "Derived" will automatically calls non-arg constructor of class "Base" and intialzes value to the variables
引数なしのコンストラクターはプログラマーによってのみ定義されます。変数を初期化することもできます。ここで追加するもう1つのポイントは、super()呼び出しが、派生クラスでsuper()が見つからない場合、Javaコンパイラーによって自動的に追加されることです。
例えば:
Class Base {
int y;
public Base() {
}
public int getY() {
return y;
}
}
public class Derived extends Base {
private int x;
public Derived() { //super() will be automatically used
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
}
Derived d = new Derived();
System.out.println("Base x value => " + d.getX());
System.out.println("Base y value => " + d.getY());
Result:
Base x value => 0 // Default value to its primitive datatype(In this case: int)
Base y value => 0
あなたの質問への答えはいいえです。Javaクラスで何らかの種類のコンストラクタを書いた場合、デフォルトのコンストラクタを提供しません。
それらの違いの1つは、引数なしのコンストラクターに独自のコードを挿入できるのに対し、デフォルトコンストラクターの本体は常に空になることです。