3

このコードは、今日のコンピューター サイエンスのクラスで提示されました (この記事と関係のない質問がいくつかあります)。これは宿題ではなく、私が個人的にコードで見つけたいくつかの問題です。

public class CloneClass implements Cloneable {
    private Element element ;

    public CloneClass ( Element newElement ) {
        element = newElement ;
    }

    public CloneClass clone () {
        try {
            // I don't understand this
            CloneClass copy = ( CloneClass ) super.clone ();
            // or this
            copy.element = element.clone ();

            return copy ;
        } catch ( CloneNotSupportedException e ) {
            return null ;
        }
    }
}

まず;

CloneClass copy = ( CloneClass ) super.clone ();

super は Object であり (明示的な拡張がないため) super.clone()、 のインスタンスを返さなければならないことがわかっていますCloneClass(インスタンスを返すことはできません。これはObject抽象的であり、 にダウンキャストされているため、または 子孫のインスタンスCloneClassである必要があります)。 私の質問; インスタンスを返すことをどのように知っていますか?CloneClass
super.clone()CloneClass

第二に;

copy.element = element.clone ();

そのように直接参照することはどのように可能copy.elementですか。非公開として宣言されています!
現在のクラスの属性ではなく、別のインスタンスの属性です (たまたま同じクラスです)

第三に;

} catch ( CloneNotSupportedException e ) {

なぜこれが必要なのですか?これElementは伸びない場合Cloneableですか?

4

4 に答える 4

6

super.clone() は CloneClass インスタンスを返すことをどのように認識していますか?

superメソッド内であってもthis、同じオブジェクトを指しているため、(またはサブクラスも)提供されthis.getClass()ます。CloneClass

そのような copy.element を直接参照するにはどうすればよいですか。非公開として宣言されています!

だけでなく、同じクラスthisの他のインスタンスのプライベート フィールドにもアクセスできます。他のクラスに対してのみプライベートです。

なぜこれが必要なのですか?これは Element が Cloneable を拡張しない場合ですか?

CloneClassCloneable を拡張できない可能性があるため(これは明らかに拡張しますが、この API が CloneNotSupportedException をスローする Object#clone で設計されているため、コンパイラはこの接続を確立できません)。

これは、Java でのちょっとしたデザインの疣贅です。Object にはcloneメソッドがありますが、Object 自体は Cloneable ではありません (これはマーカー インターフェイスです)。したがって、それをサポートしていないオブジェクトでメソッドを呼び出すことができます。Serializable と同様のこと。

于 2013-04-15T04:32:14.913 に答える
0
// I don't understand this
CloneClass copy = ( CloneClass ) super.clone ();

すべてのメンバー (プリミティブ型と参照型の両方) のビットごとのコピーによって、このオブジェクトのコピーを構築します。

// or this
copy.element = element.clone ();

上記を参照。この行の前でcopy.elementは、 と同じオブジェクトを指していますthis.element。この行はそれを複製するので、それらは異なる要素を指すようになり、 の複製は からthis完全に独立していthisます。

于 2013-04-15T04:58:05.410 に答える
0

Object#clone署名は

保護されたオブジェクトの clone() が CloneNotSupportedException をスローする

複製されるオブジェクトの内部の「深い構造」を構成する変更可能なオブジェクトをコピーして を返すためObject、 Object タイプである をキャストする必要がありますCloneClass

copy.element = element.clone ();

同じクラスにいるため、プライベートフィールドを参照できます。

} catch (CloneNotSupportedException e) {

Object#cloneCloneNotSupportedExceptionオブジェクトのクラスが Cloneable インターフェイスをサポートしていない場合にスローされます。clone メソッドをオーバーライドするサブクラスも、この例外をスローして、インスタンスを複製できないことを示すことができます。

于 2013-04-15T04:32:48.633 に答える
0

1) Object.clone API は、任意のオブジェクト x に対して x.clone().getClass() == x.getClass() が true であることを示しています。

2) 同一クラスでアクセスするため、private copy.element へのアクセスが可能

3) Element が Cloneable を実装していない場合、element.clone() は CloneNotSupportedException をスローし、キャッチされて null が返されます。

于 2013-04-15T04:40:09.453 に答える