C++と同じように、 ジャワ もサポートしています コピーコンストラクター 。しかし、 C++ デフォルトで作成されます。 Java では独自のコピー コンストラクターを定義します。このセクションでは、 Java のコピー コンストラクターと例 。
コンストラクタ
Java では、 コンストラクタ はメソッドと同じですが、唯一の違いは、コンストラクターの名前がクラス名と同じであることです。クラスのインスタンスを作成するために使用されます。クラスのオブジェクトを作成すると自動的に呼び出されます。戻り値の型はありません。コンストラクターは次のことはできないことに注意してください。 抽象的な 、 最後の 、 同期した 、 そして 静的 。コンストラクターをオーバーライドすることはできません。呼び出されるとき、メモリ内のある程度のスペースを占有します。
.tostring java
コンストラクターの種類
- デフォルトのコンストラクター
- パラメータ化されたコンストラクタ
上記の 2 つのコンストラクターを除き、Java はコピー コンストラクターもサポートしています。詳しく説明しましょう。
なぜコピーコンストラクターが必要なのでしょうか?
場合によっては、クラスの既存のオブジェクトの正確なコピーを作成する必要があるという問題に直面することがあります。また、コピーに変更を加えた場合、それが元のコピーに反映されないようにし、その逆も同様であるという条件もあります。このような場合に備えて、Java は次の概念を提供します。 コピーコンストラクター 。
コピーコンストラクター
Java では、コピー コンストラクターは、同じ Java クラスの別のオブジェクトを使用してオブジェクトを作成する特殊なタイプのコンストラクターです。クラスの既存のオブジェクトの複製コピーを返します。
最終フィールドに値を割り当てることはできますが、 clone() メソッドを使用している間は同じことはできません。これは、既存のオブジェクトのディープ コピーを作成する場合に使用されます。 clone() メソッドと比較して実装が簡単です。
注: サブクラスに継承することはできません。親クラス参照から子クラス オブジェクトを初期化しようとすると、コピー コンストラクターを使用してクローンを作成するときにキャストの問題に直面します。
コピーコンストラクターの使用
次の場合は、コピー コンストラクターを使用できます。
- 複数のフィールドを持つオブジェクトのコピーを作成します。
- 重いオブジェクトのディープ コピーを生成します。
- Object.clone() メソッドの使用は避けてください。
コピーコンストラクターの利点
- フィールドが Final として宣言されている場合、コピー コンストラクターはそれを変更できます。
- 型キャストする必要はありません。
- オブジェクトに複数のフィールドがある場合、その使用が簡単になります。
- これにより、クラスへのフィールドの追加が簡単になります。コピー コンストラクター内でのみ変更する必要があります。
コピーコンストラクターの作成
Java でコピー コンストラクターを作成するには、以下の手順に従います。
- 同じクラスのオブジェクトをパラメーターとして受け入れるコンストラクターを作成します。
public class Fruits { private double price; private String name; //copy constructor public Fruits(Fruits fruits) { //getters } }
- 各フィールド (変数) オブジェクトを新しく作成したインスタンスにコピーします。
public class Fruits { private double price; private String name; //copy constructor public Fruits(Fruits fruits) { //copying each filed this.price = fruits.price; //getter this.name = fruits.name; //getter } }
コピーコンストラクターの例
CopyConstructorExample.java
df.loc
public class Fruit { private double fprice; private String fname; //constructor to initialize roll number and name of the student Fruit(double fPrice, String fName) { fprice = fPrice; fname = fName; } //creating a copy constructor Fruit(Fruit fruit) { System.out.println(' After invoking the Copy Constructor: '); fprice = fruit.fprice; fname = fruit.fname; } //creating a method that returns the price of the fruit double showPrice() { return fprice; } //creating a method that returns the name of the fruit String showName() { return fname; } //class to create student object and print roll number and name of the student public static void main(String args[]) { Fruit f1 = new Fruit(399, 'Ruby Roman Grapes'); System.out.println('Name of the first fruit: '+ f1.showName()); System.out.println('Price of the first fruit: '+ f1.showPrice()); //passing the parameters to the copy constructor Fruit f2 = new Fruit(f1); System.out.println('Name of the second fruit: '+ f2.showName()); System.out.println('Price of the second fruit: '+ f2.showPrice()); } }
出力:
Name of the first fruit: Ruby Roman Grapes Price of the first fruit: 399.0 After invoking the Copy Constructor: Name of the second fruit: Ruby Roman Grapes Price of the second fruit: 399.0
コピー コンストラクターと clone() メソッド
コピー コンストラクターと clone() メソッドは両方とも、クラスの既存のオブジェクトのコピーを作成するために使用されます。ただし、コピー コンストラクターの使用は、以下に示す理由により、 clone() メソッドと比較して簡単で優れています。
- clone() メソッドを使用している場合は、 クローン可能 メソッドが例外をスローする可能性があります CloneNotSupportException。 したがって、プログラム内で例外を処理するのは複雑な作業です。コピー コンストラクターでは、そのような複雑さはありません。
- フィールドが次の場合、値を割り当てることはできません。 最後の 。コピー コンストラクター内で、最終フィールドに値を割り当てることができます。
- clone() メソッドによって返されるオブジェクトは次のとおりである必要があります。 タイプキャスト 。コピー コンストラクターではそのような要件はありません。