2

Javadocによると-

クラスObject自体はイ​​ンターフェイスCloneableを実装していないため、クラスがObjectであるオブジェクトに対してcloneメソッドを呼び出すと、実行時に例外がスローされます。

Objectクラスのcloneメソッドが保護されているのはなぜですか?そうですか ?

つまり、cloneableを実装していないクラスは、cloneメソッドが呼び出されたときにCloneNotSupported例外をスローします。

テストプログラムを実行しました

public class Test extends ABC implements Cloneable{

    @Override
    public Object clone() throws CloneNotSupportedException {
        System.out.println("calling super.clone");
            return super.clone();
    }

    public static void main(String[] args) {
        Test t = new Test();
        try{
        t.clone();
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }
}
class ABC{

}

クラステストのクローンメソッドからsuper.cloneが呼び出されていますか?

なぜ例外をスローしないのですか?

4

6 に答える 6

2

Testインスタンスの継承ツリーは次のtようになります

Object
  ABC
    Test

Testまた、を実装します。これは、メソッドを呼び出すと、メソッドのメソッドが呼び出されるCloneableことを意味します。インスタンスがインターフェースを実装しているかどうかをチェックします。メソッドを実装しているため、例外はスローされません。super.clone() ObjectclonetCloneable

于 2010-08-13T07:39:07.187 に答える
1

Cloneableインターフェースは、実装クラスがcloneメソッドをサポートしていることを示すマーカーインターフェースです。super.clone()が例外をスローしない理由は、super.clone()が呼び出されているベースオブジェクトが継承によってクローン可能であるためです。

Javadocから:

クラスはCloneableインターフェースを実装して、Object.clone()メソッドに、そのメソッドがそのクラスのインスタンスのフィールドごとのコピーを作成することが合法であることを示します。

Cloneableインターフェイスを実装していないインスタンスでObjectのcloneメソッドを呼び出すと、例外CloneNotSupportedExceptionがスローされます。

参照:クローン可能(Java Platform SE 6)

于 2010-08-13T07:38:53.943 に答える
1

クラスがを実装しているためCloneableです。のJavadocからCloneable

クラスはCloneableインターフェースを実装して、Object.clone()メソッドに、そのメソッドがそのクラスのインスタンスのフィールドごとのコピーを作成することが合法であることを示します。

Objectしたがって、これによりのメソッドを使用できますclone()。これは(これもJavadocによると)オーバーライドするための単なる規則clone()です。これをオーバーライドせず、Objectclone()メソッドがフィールドごとのコピーを実行するCloneNotSupportedException場合でも、フィールドの1つ自体がクローン可能でない場合はを取得する可能性があります。したがって、それをオーバーライドすることをお勧めします。

于 2010-08-13T07:39:17.140 に答える
1

Objectクラスのcloneメソッドはなぜprotectedですか?

そのため、クローン作成をサポートすることを選択したクラスは、パブリックAPIでそれを公開するように 強制されません。

あなたの例が示すように、サブクラスは、メソッドの継承されたバージョンよりも多くのアクセス権を持つメソッドをオーバーライドすることができます。この方法でメソッドのアクセスを減らすことはできません。

つまり、cloneableを実装していないクラスは、cloneメソッドが呼び出されたときにCloneNotSupported例外をスローします。

それは正しいです。

クラステストのクローンメソッドからsuper.cloneが呼び出されていますか?

それは正しいです。

なぜ例外をスローしないのですか?

クラスがを実装することを宣言したためですCloneable。これを行わなかった場合、例外スローされます...クローンメソッドがまだ呼び出していると仮定しますsuper.clone()

于 2010-08-13T07:43:35.633 に答える
1

これにより、メソッドが保護されている理由とクローンメソッドが保護されている理由に対する答えが得られる可能性があります

Cloneableを実装しているため、例外はスローされません。クローン可能なドキュメントから:

「クラスはCloneableインターフェースを実装して、そのメソッドがそのクラスのインスタンスのフィールドごとのコピーを作成することが合法であることをObject.clone()メソッドに示します。実装されていないインスタンスでObjectのcloneメソッドを呼び出すCloneableインターフェースでは、例外CloneNotSupportedExceptionがスローされます。」

ただし、実装するときに、例外がスローされないように、フィールドごとのコピーを作成することが合法であることをObject実装に通知します。

于 2010-08-13T07:51:41.917 に答える
1

面接対象者を混乱させる良い質問だと思います:)。

例外をスローしない理由に関する限り。オブジェクトの方法でそれを考えてください。tオブジェクトは、cloneableを実装するTestクラスです。メソッドsuper.cloneを呼び出すと、それはまだクラスTestのオブジェクトであるため、CloneNotSupported例外をスローする理由はありません。それがクラスObject自体のオブジェクトであった場合、例外がスローされます。

于 2010-08-13T13:02:03.030 に答える