Java cloneメソッドの詳細と簡単な例
2227 ワード
Java cloneメソッドの詳細
「clone」とは?
実際のプログラミングの過程で、ある時点でAにいくつかの有効値が含まれているオブジェクトAがあり、この場合、Aと完全に同じ新しいオブジェクトBが必要になり、その後Bに対する変更はAの値に影響しないことがよくあります.つまり、AとBは2つの独立したオブジェクトですが、Bの初期値はAオブジェクトによって決定されます.Java言語では,単純な付与文ではこのようなニーズを満たすことはできない.このようなニーズを満たすには多くの方法があるが,clone()を実現する方法はその中で最も簡単で,最も効率的な手段である.
Javaのすべてのクラスはデフォルトでjava.lang.Objectクラスを継承します.java.lang.Objectクラスにはメソッドclone()があります.JDK APIの説明文書は、この方法がObjectオブジェクトのコピーを返すと説明している.説明するのは2つです.1つは、コピーオブジェクトが参照ではなく新しいオブジェクトを返すことです.2つ目は、コピーオブジェクトとnewオペレータで返される新しいオブジェクトの違いです.このコピーには、オブジェクトの初期情報ではなく、元のオブジェクトの情報が含まれています.
clone()メソッドをどのように適用しますか?
典型的な呼び出しclone()コードは次のとおりです.
注意すべき点は3つあります.1つは、clone機能を実現したいCloneClassクラスがCloneableインタフェースを実現していることです.このインタフェースはjava.langパッケージに属し、java.langパッケージはデフォルトのインポートクラスになっているので、java.lang.Cloneableと書く必要はありません.もう一つ注意すべきはclone()メソッドを再ロードしたことです.最後にclone()メソッドでsuper.clone()が呼び出されます.これは、cloneクラスの継承構造がどのようなものであっても、super.clone()がjava.lang.Objectクラスのclone()メソッドを直接または間接的に呼び出すことを意味します.以下、これらの点をもう少し詳しく説明します.
3つ目は最も重要な点と言えますが、Objectクラスのclone()のnativeメソッドをよく観察すると、nativeメソッドの効率は一般的にjavaの非nativeメソッドよりはるかに高いです.これは、クラスをnewしてから元のオブジェクトの情報を新しいオブジェクトに割り当てるのではなく、Objectのclone()メソッドを使用する理由を説明しています.これもclone機能を実現していますが.第2点についても、Objectクラスのclone()がprotected属性の方法であるかを観察します.これはclone()メソッドを適用するには、Objectクラスを継承する必要があり、JavaではすべてのクラスがデフォルトでObjectクラスを継承する必要があることを意味し、この点に関心を持つ必要はありません.次にclone()メソッドを再ロードします.もう1つ考えたいのは、他のクラスがこのcloneクラスのclone()メソッドを呼び出すことができるように、リロード後にclone()メソッドのプロパティをpublicに設定することです.
では、cloneクラスはなぜCloneableインタフェースを実現するのでしょうか.ちょっと注意して、Cloneableインタフェースには何の方法も含まれていません!実はこのインタフェースは1つのフラグにすぎず、このフラグもObjectクラスのclone()メソッドに対してのみであり、cloneクラスがCloneableインタフェースを実現せず、Objectのclone()メソッド(つまりsuper.clone()メソッド)を呼び出した場合、Objectのclone()メソッドはCloneNotSupportedException異常を投げ出す.
以上がcloneの最も基本的なステップであり、成功したcloneを完成させるには、「影clone」と「深さclone」とは何かを理解する必要があります.
読書に感謝して、みんなを助けることができることを望んで、みんなの当駅に対する支持に感謝します!
「clone」とは?
実際のプログラミングの過程で、ある時点でAにいくつかの有効値が含まれているオブジェクトAがあり、この場合、Aと完全に同じ新しいオブジェクトBが必要になり、その後Bに対する変更はAの値に影響しないことがよくあります.つまり、AとBは2つの独立したオブジェクトですが、Bの初期値はAオブジェクトによって決定されます.Java言語では,単純な付与文ではこのようなニーズを満たすことはできない.このようなニーズを満たすには多くの方法があるが,clone()を実現する方法はその中で最も簡単で,最も効率的な手段である.
Javaのすべてのクラスはデフォルトでjava.lang.Objectクラスを継承します.java.lang.Objectクラスにはメソッドclone()があります.JDK APIの説明文書は、この方法がObjectオブジェクトのコピーを返すと説明している.説明するのは2つです.1つは、コピーオブジェクトが参照ではなく新しいオブジェクトを返すことです.2つ目は、コピーオブジェクトとnewオペレータで返される新しいオブジェクトの違いです.このコピーには、オブジェクトの初期情報ではなく、元のオブジェクトの情報が含まれています.
clone()メソッドをどのように適用しますか?
典型的な呼び出しclone()コードは次のとおりです.
class CloneClass implements Cloneable{
public int aInt;
public Object clone(){
CloneClass o = null;
try{
o = (CloneClass)super.clone();
}catch(CloneNotSupportedException e){
e.printStackTrace();
}
return o;
}
}
注意すべき点は3つあります.1つは、clone機能を実現したいCloneClassクラスがCloneableインタフェースを実現していることです.このインタフェースはjava.langパッケージに属し、java.langパッケージはデフォルトのインポートクラスになっているので、java.lang.Cloneableと書く必要はありません.もう一つ注意すべきはclone()メソッドを再ロードしたことです.最後にclone()メソッドでsuper.clone()が呼び出されます.これは、cloneクラスの継承構造がどのようなものであっても、super.clone()がjava.lang.Objectクラスのclone()メソッドを直接または間接的に呼び出すことを意味します.以下、これらの点をもう少し詳しく説明します.
3つ目は最も重要な点と言えますが、Objectクラスのclone()のnativeメソッドをよく観察すると、nativeメソッドの効率は一般的にjavaの非nativeメソッドよりはるかに高いです.これは、クラスをnewしてから元のオブジェクトの情報を新しいオブジェクトに割り当てるのではなく、Objectのclone()メソッドを使用する理由を説明しています.これもclone機能を実現していますが.第2点についても、Objectクラスのclone()がprotected属性の方法であるかを観察します.これはclone()メソッドを適用するには、Objectクラスを継承する必要があり、JavaではすべてのクラスがデフォルトでObjectクラスを継承する必要があることを意味し、この点に関心を持つ必要はありません.次にclone()メソッドを再ロードします.もう1つ考えたいのは、他のクラスがこのcloneクラスのclone()メソッドを呼び出すことができるように、リロード後にclone()メソッドのプロパティをpublicに設定することです.
では、cloneクラスはなぜCloneableインタフェースを実現するのでしょうか.ちょっと注意して、Cloneableインタフェースには何の方法も含まれていません!実はこのインタフェースは1つのフラグにすぎず、このフラグもObjectクラスのclone()メソッドに対してのみであり、cloneクラスがCloneableインタフェースを実現せず、Objectのclone()メソッド(つまりsuper.clone()メソッド)を呼び出した場合、Objectのclone()メソッドはCloneNotSupportedException異常を投げ出す.
以上がcloneの最も基本的なステップであり、成功したcloneを完成させるには、「影clone」と「深さclone」とは何かを理解する必要があります.
読書に感謝して、みんなを助けることができることを望んで、みんなの当駅に対する支持に感謝します!