Frage

Ich versuche, ein Objekt der Klassenbezüge zu klonen, das den klonbaren Inteface implementiert.

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

Ich weiß, dass es dafür ein Arbeitsplatz gibt, aber ich muss es so implementieren. Warum ich diesen Fehler bekomme =clone() Hat den Zugriff in geschützt java.lang.Object

Warum sollte es das sagen? Ist nicht die Klonmethode eine öffentliche abstrakte Methode der klonbaren Schnittstelle, was hat sie mit Objekt zu tun. Danke im Voraus :-)

War es hilfreich?

Lösung

Sicher, alle Methoden in Object werden geerbt. Das clone Methode ist jedoch protected, somit nur aus den Unterklassen zugänglich.

Der geschützte Modifikator gibt an, dass das Mitglied nur in seinem eigenen Paket (wie bei Paket-privat) und zusätzlich durch eine Unterklasse seiner Klasse in einem anderen Paket zugegriffen werden kann.

Der Grund, warum Sie anrufen können clone() In den meisten anderen Umständen ist, dass die Unterklasse es "öffnet", indem sie es mit dem überschreibt public Zugangsmodifikator.

Andere Tipps

java.lang.Integers sind unveränderlich. Es gibt keinen Grund, einen zu klonen. Wenn du bist versuchen Um Speicher zu verschwenden, versuchen Sie es zu versuchen Integer.valueOf(myInteger.intValue()).

Der Fehler kommt, weil clone Methode von Java.lang.Object ist öffentlich nicht sichtbar.

Wie Amit und Aioobe betont, ist die Ganzzahl unveränderlich, also nicht erforderlich, es zu klonen.

Aber um Ihre Frage zu beantworten. Die Clone () -Methode ist nicht Teil der klonbaren Schnittstelle Siehe: http://download.oracle.com/javase/6/docs/api/java/lang/clonable.html Wie Aioobe es Ihnen sagt.

Die Klonmethode wird im Objekt als geschützt deklariert, und Sie müssen sie mit einer öffentlichen Methode überschreiben, um sie zu verwenden. Sehen http://download.oracle.com/javase/6/docs/api/java/lang/object.html#clone()

Kurz gesagt, der Grund dafür ist, dass es möglicherweise notwendig ist, ein Objekt zu klonen, um ein "Deep-Clone" -A-EG zu machen. Klonfelder und ihre Subelemente. Oder es ist möglicherweise nicht sinnvoll, ein Objekt zu klonen, wie der Fall bei Ganzzahl (weil es unveränderlich ist)

Erstens eine Kopie durch Klonen, die ich brauchte, wenn Sie nicht möchten, dass andere Ihre Kopie ändern. Jetzt ist Integer eine Wrapper -Klasse wie String und Double, die sind Unveränderlich. Das heißt, Sie können die Interna nicht ändern. Solange Sie die ursprüngliche Referenz haben, ist Ihr Objekt intakt.

sagen

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.

Es mag schwer zu glauben sein, aber Ihr Fehler ist richtig: Clone () hat den Zugriff in java.lang.object geschützt

Ja, weil die Clone () -Methode ist geschützt Es kann nur geerbt werden, aber Sie können es nicht auf dem Objekt einer anderen Klasse aufrufen. Jede Klasse erben Objekt, sodass Sie einfach Clone () aufrufen können.

Aber in (Standard/nativ) clone () -Methode haben Sie eine if () {}, bei der Ihre Klasse klonbar nicht implementiert wird, sondern eine Ausnahme -ClonenotsupportedException. Ich sagte nativ, weil die Clone () -Methode nativ ist, wenn Sie sie nennen, nach hinten eine andere Methode genannt wird, die in C ++ eingeführt wurde.

Hier ist ein kleiner Teil des Codes, der aufgerufen wird, wenn Sie Clone () aufrufen.

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

Danke Ist es möglich, die Quelle für eine Java -native Methode zu finden?

Sie können Reflection verwenden, um die Klonmethode aufzurufen, ohne sie in Ihrem Objekt zu überschreiben.

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

und method.invoke(a) instanceof A wird als wahr bewertet

Ohne Klonable zu implementieren, werden Sie bekommen

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

Und weil Integer Clonable nicht implementiert, werfen die Clone () -Methode java.lang.clonenotsupportedexception.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top