2012-09-22 7 views
6

-Code hinter:java: Klon-Methode Verletzung

class A implements Cloneable 
{ 
    int i, j; 

    A(int i, int j) 
    { 
     this.i = i; 
     this.j = j; 
    } 

    A() 
    { 
    } 
} 

class B extends A 
{ 
    int l, m; 

    B() 
    { 
    } 

    B(int l, int m) 
    { 
     this.l = l; 
     this.m = m; 

    } 

    public static void main(String l[]) 
    { 
     A obj = new A(1, 2); 
     B obj1 = (B) obj.clone(); // ERROR 
    } 
} 

Ich weiß, dass ich die Bedeutung des Klons bin zu verletzen, wie ich die Felder von einem Objekt zu einem völlig anderen Objekt zuweisen versuchen. Aber es ist die Fehlermeldung, die mich verwirrt.

Statement: "Fehler: clone() hat den Zugriff auf Objekt geschützt"

Eine Erweiterung sollte auch clone() zur Verfügung B machen? Wenn das so ist, sollten die Werte von i und j auch nach l und m kopiert werden? Ist das möglich ?

Antwort

7

clone() ist geschützte Methode und in Unterklassen zugänglich machen, überschreiben sie mit public Zugriff.

class A implements Cloneable{ 
    ..... 
    @Override 
    public Object clone() throws CloneNotSupportedException{ 
     return super.clone(); 
    } 
} 
+0

Wenn clone() geschützt ist, dann ist es für A verfügbar und wenn B A erweitert, sollte B Zugriff auf klonen haben? – Nil

+0

@ rd4code Siehe meine Antwort. B hat Zugriff auf die Klonmethode. Aber B sollte darauf durch Vererbung und nicht direkt durch A zugreifen. – CKing

3

Von Javadoc von Cloneable

By convention, classes that implement this interface should override Object.clone (which is protected) with a public method. See Object.clone() for details on overriding this method.

Note that this interface does not contain the clone method. Therefore, it is not possible to clone an object merely by virtue of the fact that it implements this interface. Even if the clone method is invoked reflectively, there is no guarantee that it will succeed.

Clone ist eines der frühen Entwürfe in Java und es hat Fehler

Über zugriff When a method is protected, it can only be accessed by the class itself, subclasses of the class, or classes in the same package as the class.

So ist es zugänglich in A und B Klassen so, wie Sie es tun, ist nur möglich, wenn Sie im selben Paket sind die java.lang

Sie bieten einige Verfahren wie diese innerhalb A sein geschieht.

public A copy() throws CloneNotSupportedException { 
     return (A) clone(); 
    } 

korrekte Umsetzung

@Override 
    public Object clone() throws CloneNotSupportedException { 
     return super.clone(); 
    }; 

Auch Eltern Denken Sie daran, ist nicht Art von Kind so von A nach B Gießen wird nicht funktionieren. Child ist eine Art Elternteil, so dass das Casting von B nach A funktioniert.