天天看點

《JAVA築基100例》「第34題」JAVA進階技術-對象克隆3(深克隆)

#頭條創作挑戰賽#

❤️作者簡介:大家好,我是小虛竹。Java領域優質創作者,CSDN部落格專家,華為雲享專家,掘金年度人氣作者,阿裡雲專家部落客,51CTO專家部落客

❤️技術活,該賞

❤️點贊 收藏 ⭐再看,養成習慣

零、前言

今天是學習 「JAVA語言」 打卡的第34天,我的學習政策很簡單,題海政策+ 費曼學習法。如果能把這100題都認認真真自己實作一遍,那意味着 「JAVA語言」 已經築基成功了。後面的進階學習,可以繼續跟着我,一起走向架構師之路。

一、題目描述

題目:對象的克隆是Java一項進階技術,可以根據給定的對象,獲得與其完全相同的另一個對象。

如果對象的成員變量包含可變引用類型,則需要使用深克隆技術。

二、解題思路-深克隆

建立一個位址類Address

定義三個成員變量表示:國家,省和市。

使用構造方法對它們進行指派。

并提供對應的get方法和set方法。

重寫toString()方法,來輸出對象;重寫clone方法。

再建立一個員工類Employee

定義三個成員變量表示:員工名字,年齡和位址

使用構造方法對它們進行指派。

并提供對應的get方法和set方法。

重寫toString()方法和clone方法。

「通常情況下,克隆對象都需要使用深克隆。」

三、代碼詳解

位址類:

public 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() {// 重寫toString()方法
        StringBuilder sb = new StringBuilder();
        sb.append("國家:" + state + ", ");
        sb.append("省:" + province + ", ");
        sb.append("市:" + city);
        return sb.toString();
    }

    @Override
    protected Address clone() {// 實作淺克隆
        Address address = null;
        try {
            address = (Address) super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return address;
    }
}

           

員工類:

public 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() {// 重寫toString()方法
        StringBuilder sb = new StringBuilder();
        sb.append("姓名:" + name + ", ");
        sb.append("年齡:" + age + "\n");
        sb.append("位址:" + address);
        return sb.toString();
    }

    @Override
    public Employee clone() {// 實作淺克隆
        Employee employee = null;
        try {
            employee = (Employee) super.clone();
            employee.address = address.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return employee;
    }
}

           

測試類

public class Test {
    public static void main(String[] args) {
        System.out.println("克隆之前:");
        Address address = new Address("中國", "吉林", "長春");// 建立address對象
        Employee employee1 = new Employee("小虛竹", 30, address);// 建立employee1對象
        System.out.println("員工1的資訊:");
        System.out.println(employee1);// 輸出employee1對象
        System.out.println("克隆之後:");
        Employee employee2 = employee1.clone();// 使用克隆建立employee2對象
        employee2.getAddress().setState("中國"); // 修改員工位址
        employee2.getAddress().setProvince("四川"); // 修改員工位址
        employee2.getAddress().setCity("成都"); // 修改員工位址
        employee2.setName("大虛竹"); // 修改員工名字
        employee2.setAge(24);// 修改員工年齡
        System.out.println("員工1的資訊:");
        System.out.println(employee1);// 輸出employee1對象
        System.out.println("員工2的資訊:");
        System.out.println(employee2);// 輸出employee2對象
    }

}
           
《JAVA築基100例》「第34題」JAVA進階技術-對象克隆3(深克隆)

多學一個知識點:

clone方法是一個受保護的方法,需要重寫clone方法并将clone方法的通路權限改為public。

提供克隆功能的類,需要實作Cloneable接口,不然使用clone方法時,會有異常。

java.lang.CloneNotSupportedException: com.xiaoxuzhu.Employee

《JAVA築基100例》「第34題」JAVA進階技術-對象克隆3(深克隆)

我是虛竹哥,我們下一題見~

繼續閱讀