Frage

Java doc sagt -

  

Die Klasse Object tut sich nicht   implementieren die Schnittstelle Cloneable, so   Aufruf die Klon-Methode auf einem Objekt   deren Klasse Objekt in Folge wird   eine Ausnahme zur Laufzeit zu werfen.

, weshalb Klon-Methode in Objektklasse ist geschützt? das ist so?

Das bedeutet, dass jede Klasse, die nicht klonbar nicht implementiert wird CloneNotSupported Ausnahme auslösen, wenn seine Klon-Methode aufgerufen wird.

Ich lief ein Testprogramm

public class Test extends ABC implements Cloneable{

    @Override
    public Object clone() throws CloneNotSupportedException {
        System.out.println("calling super.clone");
            return super.clone();
    }

    public static void main(String[] args) {
        Test t = new Test();
        try{
        t.clone();
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }
}
class ABC{

}

Von Klasse-Test des Klon-Methode super.clone aufgerufen wird?

Warum ist es nicht Ausnahme auslösen?

War es hilfreich?

Lösung

Vererbungsbaum der Test Instanz t sieht aus wie

Object
  ABC
    Test

Test auch Geräte Cloneable was bedeutet, dass, wenn Sie die Methode super.clone() Object des clone Methode aufgerufen wird nennen. Es prüft, ob die Instanz t implementiert die Cloneable Schnittstelle. Da es die Methode funktioniert nicht implementiert eine Ausnahme aus.

Andere Tipps

Die klonbar Schnittstelle ist eine Markierungsschnittstelle, die angibt, dass die implementierende Klasse der Klon-Methode unterstützt. Der Grund, dass super.clone () nicht eine Ausnahme ist, dass das Basisobjekt es aufgerufen wird, ist klonbar durch Vererbung.

Von der Javadoc:

  

A-Klasse implementiert die klonbar Schnittstelle zum Object.clone () -Methode, um anzuzeigen, dass es legal ist für diese Methode eine Feld-for-Feld dieser Klasse Kopie von Instanzen zu machen.

     

Klon-Methode des Hervorrufen Objekt auf eine Instanz, die nicht die klonbar Schnittstelle ergibt Ausnahme CloneNotSupportedException geworfen nicht implementiert.

Siehe auch: klonbar (Java Platform SE 6)

Da Ihre Klasse implementiert Cloneable. Von der Javadoc von Cloneable:

  

A-Klasse implementiert die klonbar Schnittstelle zum Object.clone () -Methode, um anzuzeigen, dass es legal ist für diese Methode eine Feld-for-Feld dieser Klasse Kopie von Instanzen zu machen.

So ermöglicht dies Object Methode der Verwendung clone(). Es ist (wieder nach dem Javadoc) nur eine Konvention außer Kraft zu setzen clone(). Wenn Sie es nicht außer Kraft setzen und Object Methode des clone() führt ein Feld-for-Feld zu kopieren, können Sie immer noch eine CloneNotSupportedException, wenn eines der Felder ist selbst nicht klonbar. Deshalb ist es ein guter Rat es außer Kraft zu setzen.

  

Warum ist die Klon-Methode in Objektklasse protected?

Damit eine Klasse, die wählt das Klonen zu unterstützen ist nicht gezwungen es in dem öffentlichen API zu belichten.

Als Ihr Beispiel zeigt, ist eine Unterklasse eine Methode mit einem mehr Zugang als die geerbte Version des Verfahrens außer Kraft zu setzen erlaubt. Sie können nicht nur eine Methode, den Zugang auf diese Weise reduziert werden.

  

Das bedeutet, dass jede Klasse, die nicht klonbar nicht implementiert wird CloneNotSupported Ausnahme auslösen, wenn seine Klon-Methode aufgerufen wird.

Das ist richtig.

  

Von Klasse-Test des Klon-Methode super.clone aufgerufen wird?

Das ist richtig.

  

Warum ist es nicht Ausnahme auslösen?

Weil Sie erklärt haben, dass Ihre Klasse implementiert Cloneable. Wenn Sie dies nicht getan hatten, es würde eine Ausnahme aus, ... vorausgesetzt, dass Ihre Klon-Methode noch super.clone() genannt.

Dies könnte Ihnen die Antwort, warum das Verfahren geschützt warum Klon-Methode geschützt

Es ist nicht Ausnahme werfen, weil Sie klonbar implementieren. Von der klonbar Dokumentation:

  

"A-Klasse implementiert die klonbar Schnittstelle zum Object.clone () -Methode, um anzuzeigen, dass es legal ist für diese Methode eine Feld-for-Feld dieser Klasse Kopie von Instanzen zu machen.   Unter Berufung auf Objekt Klon-Methode auf einer Instanz, dass nicht implementiert die klonbar Schnittstelle ergibt Ausnahme CloneNotSupportedException geworfen. „

Aber wie Sie es sind Implementierung Sie die Objektimplementierung sagen, dass es legal ein Feld-für-Feld Kopie zu machen, damit es nicht die Ausnahme wirft.

Ich würde eine gute Frage, sagen die Befragten zu verwechseln.)

Was den Grund, warum es nicht die Ausnahme wirft. Denken Sie daran, in Objekt Weise. Ihr T-Objekt ist der Klasse-Tests der Geräte klonbar. Wenn Sie die Methode super.clone nennen, ist es immer noch ein Objekt der Klasse-Test und so gibt es keinen Grund dafür CloneNotSupported Ausnahme zu werfen. Wäre es ein Objekt der Klasse Objekts selbst wäre es die Ausnahme ausgelöst hat.

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