6

clone メソッドの通常の実装でわからないことがあります。次のコードの try ブロックの最初の行を見ると、スーパー クラスのインスタンスを作成し、そのインスタンスへの Object 参照を返す super.clone() を呼び出しています。さて、そのインスタンスには必ずしもhireDayが含まれているとは限りません。正常にコンパイルされるのは事実ですが、インスタンスに HireDay が含まれていない場合にクラッシュするべきではありませんか?

public Object clone() {
    try {
        Employee copy = (Employee) super.clone(); // copy ID, name, and salary!
        copy.hireDay = (Date) hireDay.clone();
        return copy;
    } catch (CloneNotSupportedException e) {
        System.out.println(e);
        return null;
    }
}
4

2 に答える 2

3

のコントラクトはclone、コンストラクターと同じ呼び出しパターンを実現することです。最初のステップは、常にスーパークラスの実装を呼び出すことです。これにより、Object.clone最初に呼び出され、すべてのサブクラスがそのメソッドによって返されたインスタンスを使用します。

Object.cloneクローンされたものと同じクラスのインスタンスを返します。これは、基本的にメモリ ブロックのビットごとのコピー + コピーへの必要な変更によって、言語外の魔法によって発生します。

祖先チェーン内の非準拠クラスはすべての子孫のクローン作成を中断するため、クローン作成メカニズムは脆弱です。これは、このメカニズムが好まれないいくつかの理由の 1 つです。

于 2013-03-22T14:16:53.913 に答える
3

clone()Object正しい基本クラス型の新しいインスタンスを作成し、すべてのフィールドをコピーする (そしてコンストラクターの使用を避ける)基本クラスの特別なメソッドです。したがって、委任しないObject.clone()カスタムの親クラスがない場合は、常に現在の型が返されます。

補足として、あなたの例では、 が を返さなかった場合super.clone()参照するステップに到達する前に、コードは ClassCastException をスローします。EmployeehireDay

于 2013-03-22T14:13:32.283 に答える