Bản sao () phương thức được sử dụng để tạo bản sao của một đối tượng của một lớp thực thi Có thể sao chép giao diện. Theo mặc định, nó sao chép theo từng trường vì lớp Đối tượng không có bất kỳ ý tưởng nào về các thành viên của lớp cụ thể mà các đối tượng của nó gọi phương thức này. Vì vậy, nếu lớp chỉ có các thành viên kiểu dữ liệu nguyên thủy thì một bản sao mới của đối tượng sẽ được tạo và tham chiếu đến bản sao đối tượng mới sẽ được trả về. Tuy nhiên, nếu lớp chứa các thành viên của bất kỳ loại lớp nào thì chỉ các tham chiếu đối tượng đến các thành viên đó mới được sao chép và do đó các tham chiếu thành viên trong cả đối tượng gốc cũng như đối tượng được nhân bản đều tham chiếu đến cùng một đối tượng.
Chúng tôi sẽ nhận được CloneNotSupportedException nếu chúng tôi cố gắng gọi clone () trên một đối tượng của một lớp không triển khai Có thể sao chép giao diện. Giao diện này là giao diện điểm đánh dấu và việc triển khai giao diện này chỉ đơn giản chỉ ra rằng Object.clone () phương thức có thể được gọi trên các đối tượng của lớp thực thi.
Cú pháp
protected Object clone() throws CloneNotSupportedException
Chúng ta có thể triển khai phương thức clone () theo hai cách
Sao chép nông
Đây là kết quả của chức năng sao chép mặc định được cung cấp bởi Object.clone () nếu lớp cũng có các thành viên kiểu dữ liệu không nguyên thủy. Trong trường hợp Sao chép nông, đối tượng được sao chép cũng tham chiếu đến cùng một đối tượng mà đối tượng gốc tham chiếu đến vì chỉ các tham chiếu đối tượng được sao chép chứ không phải các đối tượng được giới thiệu.
Ví dụ
public class ShallowCopyTest { public static void main(String args[]) { A a1 = new A(); A a2 = (A) a1.clone(); a1.sb.append("Tutorialspoint!"); System.out.println(a1); System.out.println(a2); } } class A implements Cloneable { public StringBuffer sb = new StringBuffer("Welcome to "); public String toString() { return sb.toString(); } public Object clone() { try { return super.clone(); } catch(CloneNotSupportedException e) { } return null; } }
Đầu ra
Welcome to Tutorialspoint! Welcome to Tutorialspoint!
Bản sao sâu
Chúng tôi cần ghi đè clone () phương thức để các lớp có thành viên kiểu không phải nguyên thủy để đạt được Bản sao sâu vì nó yêu cầu các đối tượng thành viên cũng phải được sao chép, điều này không được thực hiện bởi cơ chế sao chép mặc định.
Ví dụ
public class DeepCopyTest { public static void main(String args[]) { A a1 = new A(); A a2 = (A) a1.clone(); a1.sb.append(" TutorialsPoint!"); System.out.println(a1); System.out.println(a2); } } class A implements Cloneable { public StringBuffer sb = new StringBuffer("Welcome to "); public String toString() { return sb.toString(); } public Object clone() { try { A a = (A) super.clone(); a.sb = new StringBuffer(sb.toString()); return a; } catch(CloneNotSupportedException e) { } return null; } }
Đầu ra
Welcome to TutorialsPoint! Welcome to