Domanda
Sto cercando di clonare un oggetto della classe Integer, che realizza l'inteface clonabile.
Integer a = new Integer(4);
Integer b = a.clone();
So che ci sono soluzioni per questo, ma devo implementare in questo modo.
perché sto ottenendo questo errore =
clone()
ha protetto l'accesso a java.lang.Object
Perché dovrebbe dire questo? non è il metodo clone di un metodo astratto pubblica dell'interfaccia clonabile, che cosa ha a che fare con l'oggetto. Grazie in anticipo: -)
Soluzione
Certo, tutti i metodi in Object
sono ereditate. Il metodo clone
tuttavia è protected
, quindi accessibile solo dall'interno sottoclassi .
I specifica modificatori protette che il membro è accessibile solo all'interno del proprio pacchetto (come con il pacchetto-privato) e, inoltre, da una sottoclasse della sua classe in un altro pacchetto.
Il motivo per cui è possibile chiamare clone()
nella maggior parte degli altri casi è che la sottoclasse "lo apre" sovrascrivendo con il modificatore di accesso public
.
Altri suggerimenti
java.lang.Integer
s sono immutabili. Non v'è alcun motivo di un clone. Se stai cercare di sprecare memoria, provare a Integer.valueOf(myInteger.intValue())
.
L'errore deriva dal fatto metodo clone
di java.lang.Object non è visibile al pubblico.
Come Amit e aioobe sottolinea, Integer è immutabile, quindi nessun bisogno di clonare esso.
Ma per rispondere alla tua domanda. Il metodo clone () non fa parte del dell'interfaccia vedere clonabile: http://download.oracle.com/javase/6/docs/api/java/lang/Cloneable.html come aioobe ti dice.
Il metodo clone è dichiarato come protetto in oggetto, ed è necessario sovrascrivere con un metodo pubblico al fine di utilizzarlo. Vedere http://download.oracle.com/ JavaSE / 6 / docs / api / java / lang / Object.html # clone ()
In breve la ragione di questo è che, per clonare un oggetto, potrebbe o potrebbe non essere necessario fare un "deep-clone" es. campi clone ei relativi elementi secondari. Oppure potrebbe non avere senso per clonare un oggetto, come il caso è con Integer (perché è immutabile)
Prima di tutto ottenere una copia attraverso la clonazione di cui avevo bisogno, quando non volete gli altri per cambiare la vostra copia. Ora Integer è una classe wrapper come String e Double che sono Immutabile . Ciò significa che non potete modificare l'interno di esso. Quindi, fintanto che avete il riferimento originale l'oggetto è intatto.
esempio
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.
Può essere difficile da credere, ma il vostro errore è di destra: clone () ha protetto l'accesso a java.lang.Object
Sì, perché il metodo clone () è protetto può essere ereditata solo, ma non si può chiamare su un oggetto di un'altra classe. Ogni classe eredita oggetto, in modo da poter chiamare clone ().
MetodoMa in (default / native) clone () si dispone di un caso () {}, in cui se la classe non implementa Cloneable, è un'eccezione CloneNotSupportedException. Ho detto perché nativo, il metodo clone () è nativo, quando si chiama, sul retro è chiamato un altro metodo writed in C ++.
Questa è una piccola parte del codice che viene chiamata quando si chiama clone ().
if (!klass->is_cloneable()) {
ResourceMark rm(THREAD);
THROW_MSG_0(vmSymbols::java_lang_CloneNotSupportedException(), klass->external_name());
}
E 'possibile trovare la fonte di un metodo nativo di Java?
è possibile utilizzare la reflection per chiamare il metodo clone senza comando nel vostro oggetto.
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 {
}
e method.invoke(a) instanceof A
viene valutato come TRUE
senza implementare Cloneable otterrete
Caused by: java.lang.CloneNotSupportedException: defaultPackage.A
at java.lang.Object.clone(Native Method)
E poiché Integer Non implementa Cloneable, il metodo clone () getterà java.lang.CloneNotSupportedException.