51

質問:

package GoodQuestions;
public class MyClass {  
    MyClass() throws CloneNotSupportedException {
        try {
            throw new CloneNotSupportedException();
        } catch(Exception e) {
            e.printStackTrace();
        }
    }   

    public static void main(String[] args) {    
        try {
            MyClass  obj = new MyClass();
            MyClass obj3 = (MyClass)obj.clone();            
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
    }
}

ここで、クラス 'MyClass' は、'Object' クラスで clone メソッドを呼び出すことにより、独自のオブジェクトを複製できます。同じパッケージ 'GoodQuestions' 内の別のクラス ('TestSingleTon') でこのクラス ('MyClass') のクローンを作成しようとすると、次のコンパイル時エラーがスローされます。

「Object 型のメソッド clone() は表示されません

上記のエラーをスローするコードは次のとおりです。

package GoodQuestions;
public class TestSingleTon {
    public static void main(String[] args) {
        MyClass  obj = new MyClass();
        MyClass obj3 = obj.clone(); ---> here is the compile error.
    }
}
4

8 に答える 8

49

clone()アクセスを保護しました。これを追加MyClass

public Object clone(){  
    try{  
        return super.clone();  
    }catch(Exception e){ 
        return null; 
    }
}

また変更 public class MyClass implements Cloneable

于 2011-02-25T10:59:45.457 に答える
13

このエラーは、Object クラスで clone() メソッドが保護されているために発生します。したがって、それぞれのクラスで clone() メソッドをオーバーライドする必要があります。例えば。以下のコードを MyClass に追加します

@Override
protected Object clone() throws CloneNotSupportedException {

    return super.clone();
}

Cloneable インターフェースも実装します。例えば。public class MyClass implements Cloneable

于 2016-07-28T09:12:18.890 に答える
3

clone()は保護されたメソッドだからです。詳細については、 Object.clone()を参照してください。

MyClassのclone()をオーバーライドし、クラスにCloneableインターフェースを実装させます。

于 2011-02-25T10:54:10.907 に答える
2

微妙な点は、 のclone()メソッドが でMyClass定義されているのではなく、継承されていることMyClassです。objectはprotectedであるためMyClass呼び出すことができますが、実際にはそれ自体を持たないため、メソッドがないためof にアクセスできません。両方とも同じパッケージに含まれていますが、 でメソッドを定義して、. ところで、 のインターフェースを実装することを忘れないでください。clone()MyClassclone()TestSingleTonclone()MyClassclone()clone()MyClassclone()CloneableMyClass

于 2016-06-25T16:11:57.457 に答える
0

MyClass に Cloneable インターフェースを実装させるだけです。clone() の実装を提供する必要はありません。

于 2011-05-14T12:42:32.687 に答える
-1

MyClassのクローンを作成できるようにするには、Cloneableインターフェイスを実装する必要があります

于 2011-02-25T10:54:39.757 に答える
-1

これについていくつかのテストコードを実行しましたが、これが私の調査結果です。

保護されたメンバーがパッケージ間で継承されると、継承されたクラスのプライベート メンバーになります

一方

保護されたメンバーが同じパッケージ内で継承されると、継承されたクラスのデフォルトメンバーになります。

あなたの例では、 Object クラスの clone() は、パッケージ全体で MyClass に継承されます。Object クラスは java.lang パッケージにあり、MyClass は GoodQuestions パッケージにあります。したがって、clone() メソッドは MyClass クラスのプライベート メンバーになります。

これは、 TestSingleTon クラスから clone() メソッドにアクセスできない理由を説明しています。

于 2013-02-23T04:32:34.890 に答える