10

クローン可能なインターフェイスを実装するクラス Integer のオブジェクトをクローンしようとしています。

Integer a = new Integer(4);  
Integer b = a.clone();

これには回避策があることは知っていますが、このように実装する必要があります。このエラーが発生する理由 = clone()has protected access injava.lang.Object

なぜこれを言うのでしょうか?クローンメソッドは、クローン可能なインターフェイスのパブリック抽象メソッドではありませんか、オブジェクトと何の関係がありますか。前もって感謝します :-)

4

7 に答える 7

17

java.lang.Integers は不変です。クローンを作成する理由はありません。メモリを浪費しようとしている場合は、 を試してくださいInteger.valueOf(myInteger.intValue())

于 2011-04-28T07:08:55.463 に答える
9

もちろん、すべてのメソッドObjectは継承されています。ただし、cloneメソッドはprotectedであるため、サブクラス内からのみアクセスできます。

protected 修飾子は、メンバーが (package-private と同様に) 独自のパッケージ内でのみアクセスできることを指定し、さらに、別のパッケージ内のそのクラスのサブクラスによってアクセスできることを指定します。

他のほとんどの状況で呼び出すことができる理由は、サブクラスがアクセス修飾子clone()でオーバーライドすることによって「開く」ためです。public

于 2011-04-28T07:00:50.300 に答える
2

Amit と aioobe が指摘しているように、Integer は不変であるため、複製する必要はありません。

しかし、あなたの質問に答えるために。clone() メソッドは、クローン可能なインターフェースの一部ではありません: http://download.oracle.com/javase/6/docs/api/java/lang/Cloneable.htmlを参照してください。

clone メソッドは Object で保護されていると宣言されており、それを使用するには public メソッドで上書きする必要があります。http://download.oracle.com/javase/6/docs/api/java/lang/Object.html#clone ()を参照してください。

要するに、これの理由は、オブジェクトをクローンするために、「ディープクローン」を実行する必要がある場合とそうでない場合があるためです。フィールドとそのサブ要素を複製します。または、整数の場合のように、オブジェクトのクローンを作成しても意味がない場合があります (不変であるため)。

于 2011-04-28T08:29:26.220 に答える
2

clonejava.lang.Object のメソッドが公開されていないため、エラーが発生します。

于 2011-04-28T07:00:18.837 に答える
1

まず、他の人に自分のコピーを変更させたくない場合に必要な、クローン作成によってコピーを取得します。現在、Integer はImmutableである String や Double のようなラッパー クラスです。つまり、内部を変更することはできません。したがって、元の参照がある限り、オブジェクトはそのままです。

いう

Integer a = new Integer(4); // a referencing to this newly Created Integer
    b = a;  // b is referencing to..
    b = new Integer(8) // b no longer references to 4. 
                      //We changed the reference not the internals of it which is impossible.
于 2011-04-28T07:29:19.433 に答える
0

信じがたいかもしれませんが、あなたのエラーは正しいです:clone()はjava.lang.Objectのアクセスを保護しています

于 2011-04-28T09:00:42.823 に答える