2

私はJavaを初めて使用するので、知りたいのですが、1.空のクラスを作成するときに、デフォルトのコンストラクターがいくつ定義されますか?2.コピーコンストラクターを定義する必要がありますか、それともC ++のように自動定義されますか?

4

5 に答える 5

7

デフォルトのコンストラクターは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が参照のみを渡すためです。これは一種のポインターのようなものです。ただし、これらは強く型付けされているため、ポインターの計算やオフセットへのアクセスはできません。そのため、これらは割り当てと参照による受け渡しにのみ適しているため、ほとんどのポインタの問題を防ぐことができます。

于 2012-06-19T14:57:40.060 に答える
7

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()

関連する質問:

于 2012-06-19T14:57:46.910 に答える
1

コンストラクターを作成しない場合、コンパイラーが暗黙的に追加するデフォルトのコンストラクターは1つだけです。これは、パラメーター化されていないコンストラクターです。

class SomeClass{

public SomeClass() // all this is implicitly added if you don't specify anything.
{
super();
}

}

ドキュメントから:

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

そしてJavaには、コピーコンストラクタのようなものはありません。1つを明示的に定義する場合、それは別の問題ですが、コンパイラーはJavaでそのようなことを自動定義することはありません。

于 2012-06-19T14:56:42.840 に答える
1

とりわけ、答えは完全に問題ありません。より明確にするためにもう1つ追加するだけです。デフォルトのコンストラクターは、コンストラクターを定義しないときにコンパイラーが自分自身を追加するコンストラクターです...上記のように:

public ClassName() { super(); }

しかし、クラスで自分でコンストラクターを作成する場合...クラスで自分自身と同じコンストラクターを作成する場合のように..技術的には、このコンストラクターはデフォルトのコンストラクターとは呼ばれません...

私はあなたがポイントを得たことを望みます。

于 2012-06-19T15:01:44.460 に答える
1

コンストラクターが指定されていない場合、空のコンストラクターが自動的に定義します。1つまたは複数のコンストラクターを指定するとすぐに、これらのコンストラクターのみが定義されます。

コピーコンストラクタはありませんが、Javaの各クラスはclone()メソッドとしてObjectから拡張されます。

于 2012-06-19T15:06:51.987 に答える