2012-09-22 14 views
6

Kod za:Java: klon naruszenie metoda

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

wiem, że jestem naruszono znaczenie klonie jak próbuję przypisać pola jednego obiektu do zupełnie innego obiektu. Ale to błąd, który mnie myli.

komunikat: "Błąd: clone() został zabezpieczony dostęp w obiekcie"

przedłużenia powinna clone() dostępne również do B? Jeśli tak, to czy wartości i i j powinny być również skopiowane do l i m? Czy to możliwe ?

Odpowiedz

7

clone() jest metodą chronioną i udostępnianie jej w podklasach, zastępując ją dostępem public.

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

jeśli klon() jest chroniony, to jest dostępny dla A i jeśli B rozszerza A, to B powinno mieć dostęp do klonu? – Nil

+0

@ rd4code Zobacz moją odpowiedź. B ma dostęp do metody klonowania. Ale B powinien uzyskać do niego dostęp poprzez dziedziczenie, a nie przez A bezpośrednio. – CKing

3

Od Javadoc z 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 to jeden z pierwszych projektów w Javie i posiada wady

O access- 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.

Tak jest dostępny w A i B klas drodze robisz to jest możliwe tylko, jeśli są w tym samym opakowaniu, co dzieje się java.lang

Możesz podać jakiś sposób tak wewnątrz A.

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

prawidłowe wdrożenie

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

Pamiętaj także rodzica nie jest typem dziecka tak odlewu z punktu A do B nie będzie działać. Dziecko jest rodzajem rodzica, więc rzucanie od B do A będzie działało.