一.什么是clone
clone()方法是Object类中的方法,使用此方法可克隆对象。在实际编程过程中,我们常常要遇到这种情况:有一个对象object1,在某一时刻object1中已经包含了一些有效值,此时可能会需要一个和object1完全相同新对象object2,并且此后对object2任何改动都不会影响到object1中的值,也就是说,object1与object2是两个独立的对象,但object2的初始值是由object1对象确定的。在Java语言中,用简单的赋值语句是不能满足这种需 求的。要满足这种需求虽然有很多途径,但实现clone()方法是其中最简单,也是最高效的手段。
二.clone有深克隆和浅克隆,那么深克隆和浅克隆有什么区别呢?
浅克隆:只能克隆基本数据类型的属性;
深克隆:基本数据类型和引用数据类型属性都能克隆。
深克隆实现:
①被克隆类和引用属性对应的类都implements Cloneable重写clone方法;
②在被克隆类的clone方法中加上引用类型属性的赋值代码 如employee.address = address.clone();
public class TestClone { //1.克隆分为浅克隆和深克隆 // 浅克隆:只能克隆基本数据类型的属性 // 深克隆:基本类型和引用类型属性都能克隆 //2.深克隆的实现方法: // ①被克隆类和应用属性对应的类都implements Cloneable重写clone方法 // ②在被克隆类的clone方法中加上引用类型属性的赋值代码 如employee.address = address.clone(); public static void main(String[] args) { System.out.println("克隆之前"); Address address = new Address("中国", "河北省", "沧州市"); Employee employee1 = new Employee("马苏", 32, address); System.out.println("员工 1 的信息 ==> "+ employee1); //克隆之前 //员工 1 的信息 ==> Employee{name='马苏', age=32, address=Address{state='中国', province='河北省', city='沧州市'}} Employee employee2 = employee1.clone(); employee2.setAge(23); employee2.setName("jack"); employee2.getAddress().setProvince("上海"); employee2.getAddress().setCity("黄浦区->上海外滩"); System.out.println("克隆之后"); System.out.println("员工 1 的信息 ==> "+ employee1); //克隆之后 //员工 1 的信息 ==> Employee{name='马苏', age=32, address=Address{state='中国', province='河北省', city='沧州市'}} //员工 2 的信息 ==> Employee{name='jack', age=23, address=Address{state='中国', province='上海', city='黄浦区->上海外滩'}} System.out.println("员工 2 的信息 ==> "+ employee2); } } class Address implements Cloneable{ private String state; private String province; private String city; public Address(String state, String province, String city) { this.state = state; this.province = province; this.city = city; } public String getState() { return state; } public void setState(String state) { this.state = state; } public String getProvince() { return province; } public void setProvince(String province) { this.province = province; } public String getCity() { return city; } public void setCity(String city) { this.city = city; } @Override public String toString() { return "Address{" + "state='" + state + '\'' + ", province='" + province + '\'' + ", city='" + city + '\'' + '}'; } @Override protected Address clone() { Address address = null; try { address = (Address)super.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return address; } } class Employee implements Cloneable { private String name; private int age; private Address address; public Employee(String name, int age, Address address) { this.name = name; this.age = age; this.address = address; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Address getAddress() { return address; } public void setAddress(Address address) { this.address = address; } @Override public String toString() { return "Employee{" + "name='" + name + '\'' + ", age=" + age + ", address=" + address + '}'; } @Override protected Employee clone() { Employee employee = null; try { employee = (Employee) super.clone(); employee.address = address.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return employee; } }