2012-09-22 8 views
6

Mã đằng sau:java: clone phương pháp vi phạm

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

Tôi biết rằng tôi đang vi phạm các nghĩa của bản sao như tôi đang cố gắng để gán các lĩnh vực của một đối tượng đến một đối tượng hoàn toàn khác nhau. Nhưng tuyên bố lỗi của nó khiến tôi bối rối.

Bản Tuyên Bố: "Lỗi: clone() đã bảo vệ truy cập trong Object"

Mở rộng Một nên clone() sẵn cho B cũng? Nếu đó là, vì vậy giá trị của i và j nên được sao chép vào l và m cũng? Điều này có thể không?

Trả lời

7

clone() là phương pháp được bảo vệ và có thể truy cập được trong các lớp con, ghi đè bằng cách truy cập public.

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

nếu bản sao() được bảo vệ thì nó có sẵn cho A và nếu B mở rộng A thì B có quyền truy cập vào bản sao? – Nil

+0

@ rd4code Xem câu trả lời của tôi. B có quyền truy cập vào phương pháp sao chép. Nhưng B nên truy cập nó thông qua kế thừa và không thông qua A trực tiếp. – CKing

3

Từ Javadoc của 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 là một trong những thiết kế đầu trong java và nó có sai sót

Về 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.

Vì vậy, nó có thể truy cập trong AB lớp cách bạn đang làm việc đó chỉ có thể nếu bạn đang ở trong cùng một gói điều đó xảy ra là java.lang

Bạn có thể cung cấp một số phương pháp như thế này bên A.

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

Thực hiện đúng

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

Cũng Ghi cha mẹ không phải là loại con để đúc từ A đến B sẽ không hoạt động. Trẻ em là loại phụ huynh nên việc đúc từ B đến A sẽ hoạt động.