2011-10-25 27 views
8

Possible Duplicate:
Why is the clone() method protected in java.lang.Object?lý do đằng sau Object.clone() được bảo vệ

Dưới đây là mã của tôi thử nghiệm để kiểm tra làm việc phương pháp nhân bản,

class Test{ 
    int a; 
    public void setA(int value){ 
a = value; 
    } 
    public int getA(){ 
    return a; 
    } 
} 
class TestClass{ 
    public static void main(String args[]){ 
    Test obj1 = new Test(); 
    obj1.setA(100); 
    Test obj2 = obj1.clone(); 
    System.out.println("obj1 A:"+obj1.getA()+" obj2 A:"+obj2.getA()); 
    obj2.setA(9999); 
    System.out.println("obj1 A:"+obj1.getA()+" obj2 A:"+obj2.getA()); 
} 
} 

Ném lỗi biên dịch là gì: clone() đã bảo vệ truy cập trong java.lang.Object tại obj1.clone()

  1. Tôi đang làm gì sai ở đây?
  2. Lý do đằng sau bản sao() được bảo vệ là gì?

Cảm ơn

Sửa cùng với Trả lời: Vâng cuối cùng tôi nhìn thấy khai thác thử nghiệm của tôi đang làm việc khi tôi thực hiện các giao diện Cloneable và overriden phương pháp clone. Nó không hoạt động với chỉ ghi đè phương thức clone() từ lớp Object. Đây là mã sửa đổi,

class Test implements Cloneable{ 
int a; 
public void setA(int value){ 
a = value; 
} 
public int getA(){ 
return a; 
} 
@Override 
protected Test clone() throws CloneNotSupportedException{  
    return(Test) super.clone(); 
    } 
} 
class TestClass{ 
    public static void main(String args[]){ 
    Test obj1 = new Test(); 
    obj1.setA(100); 
    try{ 
    Test obj2 = (Test)obj1.clone(); 
    System.out.println("obj1 A:"+obj1.getA()+" obj2 A:"+obj2.getA()); 
    obj2.setA(9999); 
    System.out.println("obj1 A:"+obj1.getA()+" obj2 A:"+obj2.getA());  
    }catch(Exception e){ 
    System.out.println("ERror"+e); 
    }   
    } 
    } 

2. Lý do clone() phương pháp là bảo vệ: Tôi thấy điều này từ cuốn sách Core Java,

Các phương pháp nhân bản là một phương pháp bảo vệ của Object, có nghĩa là mã của bạn không thể đơn giản gọi nó. Chỉ có lớp Employee mới có thể nhân bản các đối tượng Employee.

Có lý do cho hạn chế này. Hãy suy nghĩ về cách thức mà lớp Object có thể thực hiện bản sao. Nó hoàn toàn không biết gì về đối tượng, vì vậy nó chỉ có thể tạo ra một bản sao trường-byfield. Nếu tất cả các trường dữ liệu trong đối tượng là các số hoặc các kiểu cơ bản khác, việc sao chép các trường chỉ là tốt.

Nhưng nếu đối tượng chứa tham chiếu đến các đối tượng con, thì sao chép trường sẽ cung cấp cho bạn một tham chiếu khác tới đối tượng con, do đó đối tượng gốc và nhân bản vẫn chia sẻ một số thông tin.

Hy vọng điều này hữu ích cho người khác

Trả lời

2

Bạn nên ghi đè phương thức sao chép trong lớp Kiểm tra.

Lý do bảo vệ được thảo luận here mặc dù dường như không có sự đồng thuận.

Các vấn đề liên quan