2012-09-22 24 views
6

codice dietro:java: clone metodo violazione

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

So che sto violando il significato di clone di come sto cercando di assegnare i campi di un oggetto a un oggetto completamente diverso. Ma è l'errore che mi confonde.

Dichiarazione: "Errore: clone() ha protetto l'accesso in oggetto"

l'estensione di una dovrebbe rendere clone() a disposizione anche B? Se è così, i valori di iej dovrebbero essere copiati anche in lem? È possibile ?

risposta

7

clone() è un metodo protetto e per renderlo accessibile nelle sottoclassi, sovrascriverlo con l'accesso public.

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

se clone() è protetto, allora è disponibile per A e se B estende A, allora B dovrebbe avere accesso al clone? – Nil

+0

@ rd4code Vedi la mia risposta. B ha accesso al metodo clone. Ma B dovrebbe accedervi attraverso l'ereditarietà e non direttamente con A. – CKing

3

Da Javadoc di 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 è uno dei primi progetti in Java ed ha difetti

A proposito di ACCESSO 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.

modo che sia accessibile in A e B classi il modo in cui si sta facendo è possibile solo se si è nella stessa confezione che sembra essere java.lang

è possibile fornire qualche metodo come questo all'interno A.

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

attuazione corretta

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

Ricordate anche genitore non è il tipo di bambino in modo colata da A a B non funzionerà. Il bambino è un tipo di genitore, quindi il cast da B a A funzionerà.

Problemi correlati