たとえば、Cloneable を実装するクラス XXX を作成し、クラス XXX でメソッド clone をオーバーライドすると、メソッドで super.clone を呼び出す必要がありますか?
4 に答える
いくつかの重要な指針
- Cloneable はマーカー インターフェイスです。マーカー インターフェイスには、メソッドまたは変数が宣言されていません。このクラスには、たとえばクローン可能、シリアライズ可能などの機能があることを JVM に伝えるだけです。
- super.clone と言っている場合、cloneable からメソッドを呼び出しているのではなく、実際にはスーパー クラスの clone() メソッドを呼び出しているか、デフォルトで Object.clone(); を呼び出しています。
独自の実装が必要ない場合は、Object の clone メソッドを使用できますが、これにより、オブジェクトの浅いコピーが作成されます。それ以上のことをしたい場合は、独自の実装を提供することをお勧めします。
元の質問に関しては、コードがすべてを処理していることがわかっている場合、スーパーメソッドを呼び出すことは強制ではありません。ただし、スーパー クラス (この場合は Object クラス) の機能を使用する必要がある場合は、スーパー メソッドを呼び出す必要があります。
はい。スーパー クラスの実装を呼び出さない場合、必要なデータは新しいクローンにコピーされません。
更新 たとえば、スーパークラスは、そのプライベート変数を新しいクローンにコピーしたい場合があります。
実際の実装は
XXX clone = super.clone();
// 'clone' now has all the data the super class wants to know.
// add any details from your XXX class to it here.
return clone;
場合we override the method clone in the class XXX
-スーパーへの呼び出しは必要ありません。あなたはただあなたが望むことをそこで行います。-何をどのようにコピーしたいかをコピーすることを意味します。
*編集 OK 私は間違っていました ここで super.clone() が呼び出すものです:
http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#clone%28%29
super.clone() を呼び出す必要があります