Java의 객체 복제는 Cloneable 인터페이스를 통해 구현되며, clone() 메서드를 재정의하고 CloneNotSupportedException을 명시적으로 발생시켜야 합니다. 복제는 깊은 복사와 얕은 복사로 나눌 수 있습니다. 1. 깊은 복사는 변수 필드를 포함하여 객체의 완전한 복사본을 생성합니다. 2. 얕은 복사는 참조만 복사하며 원본 객체와 복사본은 동일한 데이터를 공유합니다.
Java에서 객체 복제는 어떻게 구현되나요?
소개
Java 프로그래밍에서 복제는 원본 개체를 수정하지 않고 개체의 복사본을 만드는 데 사용됩니다. 개체 복제는 개체의 여러 인스턴스 만들기, 원본 개체 수정을 방지하기 위해 개체 복사본 전달, 전체 및 얕은 복사본 구현 등 다양한 시나리오에서 사용할 수 있습니다.
복제 구현
Java의 Clone은 Cloneable
인터페이스로 구현됩니다. 복제를 구현하려는 모든 클래스는 이 인터페이스를 구현하고 clone()
메서드를 재정의해야 합니다. clone()
메서드는 객체의 복제본을 반환하고 클래스가 복제를 지원하지 않는 경우 명시적으로 CloneNotSupportedException
을 발생시켜야 합니다. Cloneable
接口实现的。任何希望实现克隆的类都必须实现此接口并覆盖clone()
方法。clone()
方法返回对象的克隆,并且必须显式抛出 CloneNotSupportedException
,如果该类不支持克隆。
深层拷贝和浅层拷贝
当克隆对象时,可以进行两种类型的拷贝:深层拷贝和浅层拷贝。
实战案例
考虑以下 Student
类,它具有三个字段:姓名、年龄和地址:
public class Student implements Cloneable { private String name; private int age; private Address address; @Override public Object clone() throws CloneNotSupportedException { return super.clone(); } // 省略getter 和 setter 方法 }
Address
类也是可克隆的:
public class Address implements Cloneable { private String street; private String city; private String state; @Override public Object clone() throws CloneNotSupportedException { return super.clone(); } // 省略getter 和 setter 方法 }
现在,考虑以下代码:
// 创建原始 Student 对象 Student originalStudent = new Student(); originalStudent.setName("John Doe"); originalStudent.setAge(21); Address originalAddress = new Address(); originalAddress.setStreet("123 Main Street"); originalStudent.setAddress(originalAddress); // 克隆原始Student对象 Student clonedStudent = (Student) originalStudent.clone(); // 修改克隆对象的字段 clonedStudent.setName("Jane Doe"); clonedStudent.setAge(22); Address clonedAddress = clonedStudent.getAddress(); clonedAddress.setStreet("456 Elm Street"); // 输出原始和克隆对象 System.out.println("Original Student:" + originalStudent); System.out.println("Cloned Student:" + clonedStudent);
输出将显示:
Original Student:Student{name='John Doe', age=21, address=Address{street='123 Main Street', city=null, state=null}} Cloned Student:Student{name='Jane Doe', age=22, address=Address{street='456 Elm Street', city=null, state=null}}
在这种情况下,由于 Address
Student
클래스를 생각해 보세요: 🎜rrreee🎜Address
클래스도 복제 가능합니다. 🎜rrreee🎜 이제 다음 코드를 고려하세요. 🎜rrreee🎜출력에 다음이 표시됩니다. 🎜rrreee🎜이 경우 Address
클래스가 복제 가능하므로 이는 Deep copy입니다. . 복제된 객체의 주소 필드를 수정해도 원본 객체의 주소 필드에는 영향을 미치지 않습니다. 🎜위 내용은 Java에서 객체 복제는 어떻게 구현됩니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!