このクローン作成メカニズムを使用するのは良い考えではないことはわかっています (何人かの著者が示唆しているように「壊れている」ため)。次のクラス階層が与えられます。
class N implements Cloneable{
protected int num;
public N clone() throws CloneNotSupportedException{
return (N)super.clone();
}
}
class M extends N{
protected String str;
public M clone() throws CloneNotSupportedException{
M obj = (M)super.clone();
obj.setString(new String(this.str));
return obj;
}
void setString(String str){
this.str = str;
}
}
N
extends以来Object
、 はどのようにしてsuper.clone()
のインスタンスを返しますN
か? super.clone()
は、実際Object.clone()
には class のオブジェクトへの参照を返しますObject
。にキャストできるのはなぜN
ですか?クラスにないN
メンバがあります。デフォルトの動作では、実際にこの変数を自動的に複製するにはどうすればよいでしょうか ( class に記録がないため)。num
Object
Object
また、同じことが M にも当てはまります。 では、オブジェクトを class (によって返される)M.clone()
から class のオブジェクトにキャストしています。これがすべて有効であることはわかっていますが、その理由はわかりません。N
super.clone()
M