#頭條創作挑戰賽#
❝
❤️作者簡介:大家好,我是小虛竹。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對象
}
}
多學一個知識點:
clone方法是一個受保護的方法,需要重寫clone方法并将clone方法的通路權限改為public。
提供克隆功能的類,需要實作Cloneable接口,不然使用clone方法時,會有異常。
❝
java.lang.CloneNotSupportedException: com.xiaoxuzhu.Employee
❞
我是虛竹哥,我們下一題見~