質問
クローン可能な整数を実装するクラス整数のオブジェクトをクローン化しようとしています。
Integer a = new Integer(4);
Integer b = a.clone();
私はこれのための仕事があることを知っていますが、私はこのようにそれを実装する必要があります。このエラーを取得している理由=clone()
アクセスを保護しています java.lang.Object
なぜこれを言うのでしょうか?クローン法は、クローン可能なインターフェイスのパブリックアブストラクトメソッドではなく、オブジェクトと何の関係がありますか。前もって感謝します :-)
解決
確かに、すべての方法 Object
継承されています。 clone
ただし、方法はです protected
, したがって、サブクラス内からのみアクセスできます。
保護された修飾子は、メンバーが独自のパッケージ内(パッケージプライベートと同様)内でのみアクセスできることを指定し、さらに、別のパッケージのクラスのサブクラスによってアクセスできることを指定します。
あなたが電話できる理由 clone()
他のほとんどの状況では、サブクラスがそれをオーバーライドすることにより「開く」ことです public
アクセス修飾子。
他のヒント
java.lang.Integer
Sは不変です。 1つをクローンする理由はありません。もしあなたが〜なら 試してみる 記憶を無駄にするには、お試しください Integer.valueOf(myInteger.intValue())
.
エラーが発生します clone
Java.lang.Objectの方法は公開されていません。
AmitとAioobeが指摘しているように、整数は不変であるため、クローンを作成する必要はありません。
しかし、あなたの質問に答えるために。 clone()メソッドは、クローン可能なインターフェイスの一部ではありません。 http://download.oracle.com/javase/6/docs/api/java/lang/clonable.html アイオベがあなたに言うように。
クローンメソッドはオブジェクトで保護されていると宣言されているため、使用するにはパブリックメソッドで上書きする必要があります。見る http://download.oracle.com/javase/6/docs/api/java/lang/object.html#clone()
要するに、この理由は、オブジェクトをクローンするためには、「深いクローン」を行う必要がある場合とそうでない場合があります。クローンフィールドとそのサブ要素。または、オブジェクトをクローンするのは意味がないかもしれません。
まず、他の人にコピーを変更したくないときに必要なクローニングでコピーを取得します。現在、整数は文字列やダブルのようなラッパークラスです。 不変。つまり、あなたはそれの内部を変えることができません。したがって、元の参照がある限り、オブジェクトは無傷です。
いう
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.
信じるのは難しいかもしれませんが、あなたのエラーは正しいです:clone()はjava.lang.objectでアクセスを保護しています
はい、clone()メソッドはです 保護されています 継承するだけですが、別のクラスのオブジェクトでそれを呼び出すことはできません。すべてのクラスがオブジェクトを継承するため、Clone()を呼び出すことができます。
ただし、(デフォルト/ネイティブ)clone()メソッドでは、if(){}があり、クラスがクローン可能でない場合、クロネノトサポートエクセプトを例外にスローします。私はネイティブと言いました。なぜなら、clone()メソッドはネイティブであり、それを呼び出すと、背面ではc ++で書かれた別のメソッドと呼ばれるためです。
Clone()を呼び出すときに呼び出されるコードのごく一部です。
if (!klass->is_cloneable()) {
ResourceMark rm(THREAD);
THROW_MSG_0(vmSymbols::java_lang_CloneNotSupportedException(), klass->external_name());
}
ありがとう Javaネイティブメソッドのソースを見つけることは可能ですか?
反射を使用して、オブジェクトにオーバーライドせずにクローンメソッドを呼び出すことができます。
public class Main{
public static void main(String[] args) throws CloneNotSupportedException {
A a = new A();
Object o = new Object();
Method method = null;
try {
method = o.getClass().getDeclaredMethod("clone");
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
method.setAccessible(true);
try {
System.out.println(method.invoke(a));
} catch (IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
}
}
class A implements Cloneable {
}
と method.invoke(a) instanceof A
真実として評価されます
クローン可能を実装せずに、あなたは得るでしょう
Caused by: java.lang.CloneNotSupportedException: defaultPackage.A
at java.lang.Object.clone(Native Method)
また、整数はクローン可能ではないため、clone()メソッドはjava.lang.clonenotsupportedexceptionを投げます。