漫谈clone()方法克隆对象

一.什么是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;
         }
    }

猜你喜欢

转载自blog.csdn.net/qq_37451441/article/details/109286977
今日推荐