私はJavaを初めて使用するので、知りたいのですが、1.空のクラスを作成するときに、デフォルトのコンストラクターがいくつ定義されますか?2.コピーコンストラクターを定義する必要がありますか、それともC ++のように自動定義されますか?
5 に答える
デフォルトのコンストラクターは1つだけです。これは、クラスのコンストラクターを宣言しない場合にのみ定義されます。それ以外の場合は、宣言されたコンストラクターが唯一のコンストラクターになります。コンストラクターを含めない場合、コンパイラーは以下と同等のコードを挿入します
public ClassName() {
super();
}
さらに、クラスのコンストラクターを宣言し、スーパークラスのコンストラクター呼び出しを明示的に定義しない場合、コンパイラーはパラメーター一致呼び出しをスーパークラスに挿入します。
public ClassName extends SuperClassName {
public ClassName(String item, List stuff) {
// no explicit super class constructor called
...
}
}
コンパイラで次のようなものに変換されます
public ClassName extends SuperClassName {
public ClassName(String item, List stuff) {
// explicit super class constructor call to SuperClassName(item, stuff);
super(item, stuff);
...
}
}
コピーコンストラクターを定義するために、特別な構文はありません。基本的に、クラスの別のインスタンスを引数として取るコンストラクターを定義します。
public ClassName(ClassName other) {
field = other.field;
field2 = other.field2;
field3 = new ArrayList(other.field3);
...
}
デフォルトのコピーコンストラクターのようなものはありません。実際には、コピーコンストラクターのようなものはなく、コンストラクターだけがあります。オブジェクトをコピーしているように見えるものを1つ以上作成することにした場合は、そうしてください。
Javaが必要とするアイテムのタイプが少ない理由は、基本的な演算子をオーバーロードしないことにいくらか関係しています。これ以上の意味を=
持たない場合は、オブジェクト割り当てのさまざまなメソッドをサポートするために、それほど多くの種類のコンストラクターは必要ありません。
=
このように単純に使用できる理由の1つは、 Javaが参照のみを渡すためです。これは一種のポインターのようなものです。ただし、これらは強く型付けされているため、ポインターの計算やオフセットへのアクセスはできません。そのため、これらは割り当てと参照による受け渡しにのみ適しているため、ほとんどのポインタの問題を防ぐことができます。
1.空のクラスを作成すると、デフォルトのコンストラクターがいくつ定義されますか?
などのクラス
class MyClass {
}
次のように動作するデフォルトの(空の)コンストラクターが1つあります
...
public MyClass() {
}
...
2.コピーコンストラクターを定義する必要がありますか、それともC ++のように自動定義されますか?
Javaには組み込みのコピーコンストラクタの概念はなく、これには根本的な理由があります。
Javaでは、変数にオブジェクトを含めることはできません(オブジェクトへの参照のみを含めることができます)。したがって、を実行する場合、参照するfoo(obj)
オブジェクトをobj
コピーする必要はありません。
オブジェクトのコピーを作成するには、通常、次のようなコンストラクターを作成します。
...
public MyClass(MyClass objToCopy) {
this.field1 = objToCopy.field1;
...
this.fieldN = objToCopy.fieldN;
}
...
または、メカニズムに依存しますclone()
。
関連する質問:
コンストラクターを作成しない場合、コンパイラーが暗黙的に追加するデフォルトのコンストラクターは1つだけです。これは、パラメーター化されていないコンストラクターです。
class SomeClass{
public SomeClass() // all this is implicitly added if you don't specify anything.
{
super();
}
}
ドキュメントから:
コンパイラーは、コンストラクターのないクラスに対して、引数のないデフォルトのコンストラクターを自動的に提供します。このデフォルトのコンストラクターは、スーパークラスの引数なしのコンストラクターを呼び出します。この状況では、スーパークラスに引数のないコンストラクターがない場合、コンパイラーは文句を言うので、引数のないコンストラクターがあることを確認する必要があります。クラスに明示的なスーパークラスがない場合は、引数のないコンストラクターを持つObjectの暗黙的なスーパークラスがあります。
そしてJavaには、コピーコンストラクタのようなものはありません。1つを明示的に定義する場合、それは別の問題ですが、コンパイラーはJavaでそのようなことを自動定義することはありません。
とりわけ、答えは完全に問題ありません。より明確にするためにもう1つ追加するだけです。デフォルトのコンストラクターは、コンストラクターを定義しないときにコンパイラーが自分自身を追加するコンストラクターです...上記のように:
public ClassName() { super(); }
しかし、クラスで自分でコンストラクターを作成する場合...クラスで自分自身と同じコンストラクターを作成する場合のように..技術的には、このコンストラクターはデフォルトのコンストラクターとは呼ばれません...
私はあなたがポイントを得たことを望みます。
コンストラクターが指定されていない場合、空のコンストラクターが自動的に定義します。1つまたは複数のコンストラクターを指定するとすぐに、これらのコンストラクターのみが定義されます。
コピーコンストラクタはありませんが、Javaの各クラスはclone()メソッドとしてObjectから拡張されます。