Question

Je suis en train de cloner un objet de la classe entière, qui n'implémente l'inteface cloneable.

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

pour cela, sais qu'il ya des contournements, mais je travail dois la mettre en œuvre comme celui-ci. pourquoi je reçois cette erreur = clone() a accès protégé dans java.lang.Object

Pourquoi serait-il dire? N'est pas la méthode clone une méthode abstraite publique de l'interface clonable, qu'est-ce que cela a à voir avec l'objet. Merci à l'avance: -)

Était-ce utile?

La solution

Bien sûr, toutes les méthodes Object sont héritées. La méthode est cependant clone protected , ainsi accessible uniquement à l'intérieur des sous-classes .

Le modificateur protégé précise que le membre ne peut être consulté dans son ensemble (comme avec le paquet-privé) et, en outre, par une sous-classe de la classe dans un autre paquet.

La raison pour laquelle vous pouvez appeler clone() dans la plupart des cas est que la sous-classe « ouvre » par ce avec le modificateur remplaçant d'accès public.

Autres conseils

java.lang.Integers sont immuables. Il n'y a aucune raison d'un clone. Si vous êtes essayer à perdre la mémoire, essayez Integer.valueOf(myInteger.intValue()).

Amit et aioobe rappelle, Integer est immuable, donc pas besoin de cloner.

Mais pour répondre à votre question. La méthode ne fait pas partie du Siège d'interface clonable clone (): http://download.oracle.com/ JavaSE / 6 / docs / api / java / lang / Object.html # clone ()

En bref, la raison en est, que pour cloner un objet, il pourrait ou pourrait ne pas être nécessaire de faire un « deep-clone » par exemple. champs clones et leurs sous-éléments. Ou peut-être pas judicieux de cloner un objet, le cas est avec Integer (car il est immuable)

Tout d'abord obtenir une copie par clonage i besoin lorsque vous ne voulez pas que d'autres pour changer votre copie. Maintenant Integer est une classe wrapper comme cordes et qui sont Immuable . Cela signifie que vous ne pouvez pas changer le fonctionnement interne de celui-ci. Donc, tant que vous avez la référence originale de votre objet est intact.

par exemple

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.

Il peut être difficile à croire, mais votre erreur est droite: clone () a accès protégé dans java.lang.Object

Oui, parce que la méthode clone () est protégé il peut être seulement hérité, mais vous ne pouvez pas l'appeler sur l'objet d'une autre classe. Chaque Hériter de la classe Object, de sorte que vous pouvez simplement appeler clone ().

Mais dans la méthode (par défaut / native) clone () que vous avez un if () {} dans lequel si votre classe n'implémente Cloneable, il lancera une exception CloneNotSupportedException. Je l'ai dit parce que natif, la méthode clone () est natif, lorsque vous l'appelez, dans le dos est une autre méthode appelée writed en C ++.

Voici une petite partie du code qui est appelé lorsque vous appelez clone ().

if (!klass->is_cloneable()) {
    ResourceMark rm(THREAD);
    THROW_MSG_0(vmSymbols::java_lang_CloneNotSupportedException(), klass->external_name());
  }

Est-il possible de trouver la source pour une méthode Java native?

vous pouvez utiliser la réflexion pour appeler la méthode clone sans le remplacer dans votre objet.

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 {
}

et method.invoke(a) instanceof A est évaluée comme true

sans mettre en œuvre Cloneable vous obtiendrez

Caused by: java.lang.CloneNotSupportedException: defaultPackage.A
    at java.lang.Object.clone(Native Method)

Et parce que Integer n'implémente pas Cloneable, la méthode clone () va lancer java.lang.CloneNotSupportedException.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top