Java の clone() メソッドについて質問があります。まず第一に、クローン方法が壊れていることは知っていますが、学校でこのトピックを勉強しているので、しっかりと把握したいと思います (最も効果的な方法ではないかもしれませんが)。 .
私がこのような状況にあるとしましょう:
public class A implements Cloneable {
private int a;
private int b;
// constructors, methods, etc.
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone()
}
}
public class B extends A {
private String c;
private String d;
// constructors and all the rest
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone()
}
}
さて、私の main() に次のようなものがある場合:
B test1 = new B();
B test2 = (B) test1.clone();
私は、このメソッドがtest1のすべてclone()
の値のコピーを作成することを経験から知っています。実際、適切な get/set メソッドのおかげで、 、、およびにアクセスして変更できます。int a
int b
String c
String d
私が本当に得ていないのは、なぜこれがすべてそのように機能するのかということです。clone()
つまり、 from Bを実行すると、 from A が呼び出され、次に、 test1 の浅いコピーであるオブジェクトを返すclone()
Object が呼び出されます。このようなオブジェクトは、Aに返され、B に返され、Bに返されます。clone()
clone()
clone()
では、このコピーはどこで行われ、何がコピーされるのでしょうか? A と Bclone()
は実際には何もしません (または技術的にはコピーを行いません)。B のメソッドは A のメソッドを呼び出すだけで、A のメソッドはオブジェクトのメソッドを呼び出します。私が昨日見つけたこの質問に対する最初の答えは、A と B の方法の必要性についての私の信念を補強し、clone()
その特定のケース (たまたま私のものと同じ) では、B の方法clone()
はまったく必要ないことを述べています。
これは、オブジェクトclone()
がすべてのコピーを行うものであることを意味します。ここでのポイントは次のとおりです。オブジェクトは必要なすべてのフィールドをclone()
どのように認識しますか?
Object が B のスーパークラスであることが原因ではないかと謙虚に推測しましたが、そのような考えは実際には成り立ちません。実際、A も B のスーパークラスですが、B の中に入れた get/set メソッドがなければ、B のプライベート フィールドにアクセスできません。そして、Objectclone()
は私の get/set メソッドに基づいて確実に機能しません。
- ここで私が見逃しているものはありますか、それとも頭をかなり超えていることを理解しようとしているだけですか?
- オブジェクトの
clone()
メソッドは、ある種の「特別な」メソッドか何かですか? - オブジェクトがオブジェクトのすべてのフィールド
clone()
の浅いコピーを作成するということを、これからは公理と見なすことができますか? (それらを非公開にするか、サブクラス/スーパークラスなどでのみ表示するか...)
(できれば参考文献を提供してください。私があなたを信用していないわけではありません。ただ、すべての教科書やオンラインも検索しただけです。次に質問があるときにどこを見ればよいか知りたいです)このような! ;) )