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: -)

È stato utile?

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.Integers 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 ().

Metodo

Ma 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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top