2012-09-22 18 views
6

Código atrás:java: método clone violación

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

Sé que estoy violando el significado del clon como estoy tratando de asignar los campos de un objeto a un objeto completamente diferente. Pero es la declaración de error que me está confundiendo.

Declaración: "Error: clone() ha protegido el acceso en el objeto"

La extensión de un clone() debe hacer disponible a B también? Si eso es así, ¿entonces los valores de i y j deberían copiarse a l y m también? Es posible ?

Respuesta

7

clone() es un método protegido y para hacer accesible en subclases, anularlo con acceso public.

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

si clone() está protegido, entonces está disponible para A y si B se extiende A, entonces B debería tener acceso a clonar? – Nil

+0

@ rd4code Ver mi respuesta. B tiene acceso al método de clonación. Pero B debe acceder a ella a través de la herencia y no a través de A directamente. – CKing

3

De Javadoc de 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 es uno de los primeros diseños en java y tiene defectos

Acerca de acceso- 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.

para que sea accesible en A y B clases de la manera que lo está haciendo sólo es posible si se encuentra en el mismo paquete que pasa a ser java.lang

le puede proporcionar algún método como éste en el interior A.

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

correcta implementación

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

también recuerdo padre no es el tipo de niño para la fundición de A a B no va a funcionar. El niño es el tipo de padre, por lo que el casting de B a A funcionará.