零、前言
? 今天是學(xué)習(xí) JAVA語(yǔ)言 打卡的第33天,每天我會(huì)提供一篇文章供群成員閱讀( 不需要訂閱付錢(qián) ),讀完文章之后,按解題思路,自己再實(shí)現(xiàn)一遍。在小虛竹JAVA社區(qū) 中對(duì)應(yīng)的 【打卡貼】打卡,今天的任務(wù)就算完成了。
? 因?yàn)榇蠹叶荚谝黄饘W(xué)習(xí)同一篇文章,所以有什么問(wèn)題都可以在群里問(wèn),群里的小伙伴可以迅速地幫到你,一個(gè)人可以走得很快,一群人可以走得很遠(yuǎn),有一起學(xué)習(xí)交流的戰(zhàn)友,是多么幸運(yùn)的事情。
? 學(xué)完后,自己寫(xiě)篇學(xué)習(xí)報(bào)告的博客,可以發(fā)布到小虛竹JAVA社區(qū) ,供學(xué)弟學(xué)妹們參考。
? 我的學(xué)習(xí)策略很簡(jiǎn)單,題海策略+ 費(fèi)曼學(xué)習(xí)法。如果能把這100題都認(rèn)認(rèn)真真自己實(shí)現(xiàn)一遍,那意味著 JAVA語(yǔ)言 已經(jīng)筑基成功了。后面的進(jìn)階學(xué)習(xí),可以繼續(xù)跟著我,一起走向架構(gòu)師之路。
一、題目描述
題目:對(duì)象的克隆是Java一項(xiàng)高級(jí)技術(shù),可以根據(jù)給定的對(duì)象,獲得與其完全相同的另一個(gè)對(duì)象。
在克隆對(duì)象時(shí),如果對(duì)象的成員變量是基本類(lèi)型時(shí),使用淺克隆就能完成。
如果對(duì)象的成員變量包含可變引用類(lèi)型,則需要使用深克隆技術(shù)。
如果引用類(lèi)型是不可變的,如String類(lèi)的對(duì)象,則不必進(jìn)行深克隆。
二、解題思路-淺克隆
創(chuàng)建一個(gè)地址類(lèi)Address
定義三個(gè)成員變量表示:國(guó)家,省和市。
使用構(gòu)造方法對(duì)它們進(jìn)行賦值。
并提供對(duì)應(yīng)的get方法和set方法。
重寫(xiě)toString()方法,來(lái)輸出對(duì)象。
再創(chuàng)建一個(gè)員工類(lèi)Employee
定義兩個(gè)成員變量表示:員工名字,年齡和地址
使用構(gòu)造方法對(duì)它們進(jìn)行賦值。
并提供對(duì)應(yīng)的get方法和set方法。
重寫(xiě)toString()方法和clone方法。
三、代碼詳解
地址類(lèi):
public class Address {
private String state; // 表示員工所在的國(guó)家
private String province;// 表示員工所在的省
private String city; // 表示員工所在的市
public Address(String state, String province, String city) {// 利用構(gòu)造方法進(jìn)行初始化
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() {// 重寫(xiě)toString()方法
StringBuilder sb = new StringBuilder();
sb.append("國(guó)家:" + state + ", ");
sb.append("省:" + province + ", ");
sb.append("市:" + city);
return sb.toString();
}
}
員工類(lèi):
public class Employee implements Cloneable {
private String name; // 表示員工的姓名
private int age; // 表示員工的年齡
private Address address;// 表示員工的地址
public Employee(String name, int age, Address address) {// 利用構(gòu)造方法進(jìn)行初始化
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() {// 重寫(xiě)toString()方法
StringBuilder sb = new StringBuilder();
sb.append("姓名:" + name + ", ");
sb.append("年齡:" + age + "\n");
sb.append("地址:" + address);
return sb.toString();
}
@Override
public Employee clone() {// 實(shí)現(xiàn)淺克隆
Employee employee = null;
try {
employee = (Employee) super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return employee;
}
}
測(cè)試類(lèi)
public class Test {
public static void main(String[] args) {
System.out.println("克隆之前:");
Address address = new Address("中國(guó)", "吉林", "長(zhǎng)春");// 創(chuàng)建address對(duì)象
Employee employee1 = new Employee("小虛竹", 30, address);// 創(chuàng)建employee1對(duì)象
System.out.println("員工1的信息:");
System.out.println(employee1);// 輸出employee1對(duì)象
System.out.println("克隆之后:");
Employee employee2 = employee1.clone();// 使用克隆創(chuàng)建employee2對(duì)象
employee2.getAddress().setState("中國(guó)"); // 修改員工地址
employee2.getAddress().setProvince("四川"); // 修改員工地址
employee2.getAddress().setCity("成都"); // 修改員工地址
employee2.setName("大虛竹"); // 修改員工名字
employee2.setAge(24);// 修改員工年齡
System.out.println("員工1的信息:");
System.out.println(employee1);// 輸出employee1對(duì)象
System.out.println("員工2的信息:");
System.out.println(employee2);// 輸出employee2對(duì)象
}
}
多學(xué)一個(gè)知識(shí)點(diǎn):
clone方法是一個(gè)受保護(hù)的方法,需要重寫(xiě)clone方法并將clone方法的訪(fǎng)問(wèn)權(quán)限改為public。
提供克隆功能的類(lèi),需要實(shí)現(xiàn)Cloneable接口,不然使用clone方法時(shí),會(huì)有異常。
java.lang.CloneNotSupportedException: com.xiaoxuzhu.Employee
四、推薦專(zhuān)欄
《JAVA從零到壹》
《JAVA從零到壹》第四講:類(lèi)與對(duì)象基礎(chǔ)
第六講:數(shù)組包及訪(fǎng)問(wèn)控制
《JAVA從零到壹》第七講:面向?qū)ο蟾呒?jí)特性
五、示例源碼下載
關(guān)注下面的公眾號(hào),回復(fù)筑基+題目號(hào)
筑基33