04、如何重載構造方法
/**
* @author 沉默王二,一枚有趣的程式員
*/
public class OverloadingConstrutorPerson {
private String name;
private int age;
private int sex;
public OverloadingConstrutorPerson(String name, int age, int sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
public OverloadingConstrutorPerson(String name, int age) {
this.name = name;
this.age = age;
}
public void out() {
System.out.println("姓名 " + name + " 年齡 " + age + " 性别 " + sex);
}
public static void main(String[] args) {
OverloadingConstrutorPerson p1 = new OverloadingConstrutorPerson("沉默王二",18, 1);
p1.out();
OverloadingConstrutorPerson p2 = new OverloadingConstrutorPerson("沉默王三",16);
p2.out();
}
}
建立對象的時候,如果傳遞的是三個參數,那麼就會調用 OverloadingConstrutorPerson(String name, int age, int sex) 這個構造方法;如果傳遞的是兩個參數,那麼就會調用 OverloadingConstrutorPerson(String name, int age) 這個構造方法。
05、構造方法和方法有什麼差別
構造方法和方法之間的差別還是蠻多的,比如說下面這些:
方法 構造方法
方法反映了對象的行為 構造方法用于初始化對象的字段
方法可以有傳回類型 構造方法沒有傳回類型
方法的調用是明确的,開發者通過代碼決定調用哪一個 構造方法的調用是隐式的,通過編譯器完成
方法在任何情況下都不由編譯器提供 如果沒有明确提供無參構造方法,編譯器會提供
方法名可以和類名相同,也可以不同 構造方法的名稱必須和類名相同
06、如何複制對象
複制一個對象可以通過下面三種方式完成:
通過構造方法
通過對象的值
通過 Object 類的 clone() 方法
1)通過構造方法
/**
* @author 沉默王二,一枚有趣的程式員
*/
public class CopyConstrutorPerson {
private String name;
private int age;
public CopyConstrutorPerson(String name, int age) {
this.name = name;
this.age = age;
}
public CopyConstrutorPerson(CopyConstrutorPerson person) {
this.name = person.name;
this.age = person.age;
}
public void out() {
System.out.println("姓名 " + name + " 年齡 " + age);
}
public static void main(String[] args) {
CopyConstrutorPerson p1 = new CopyConstrutorPerson("沉默王二",18);
p1.out();
CopyConstrutorPerson p2 = new CopyConstrutorPerson(p1);
p2.out();
}
}
在上面的例子中,有一個參數為 CopyConstrutorPerson 的構造方法,可以把該參數的字段直接複制到新的對象中,這樣的話,就可以在 new 關鍵字建立新對象的時候把之前的 p1 對象傳遞過去。
2)通過對象的值
/**
* @author 沉默王二,一枚有趣的程式員
*/
public class CopyValuePerson {
private String name;
private int age;
public CopyValuePerson(String name, int age) {
this.name = name;
this.age = age;
}
public CopyValuePerson() {
}
public void out() {
System.out.println("姓名 " + name + " 年齡 " + age);
}
public static void main(String[] args) {
CopyValuePerson p1 = new CopyValuePerson("沉默王二",18);
p1.out();
CopyValuePerson p2 = new CopyValuePerson();
p2.name = p1.name;
p2.age = p1.age;
p2.out();
}
}
這種方式比較粗暴,直接拿 p1 的字段值複制給 p2 對象(p2.name = p1.name)。
3)通過 Object 類的 clone() 方法
/**
* @author 沉默王二,一枚有趣的程式員
*/
public class ClonePerson implements Cloneable {
private String name;
private int age;
public ClonePerson(String name, int age) {
this.name = name;
this.age = age;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
public void out() {
System.out.println("姓名 " + name + " 年齡 " + age);
}
public static void main(String[] args) throws CloneNotSupportedException {
ClonePerson p1 = new ClonePerson("沉默王二",18);
p1.out();
ClonePerson p2 = (ClonePerson) p1.clone();
p2.out();
}
}
通過 clone() 方法複制對象的時候,ClonePerson 必須先實作 Cloneable 接口的 clone() 方法,然後再調用 clone() 方法(ClonePerson p2 = (ClonePerson) p1.clone())。
07、ending
“二哥,我能問一些問題嗎?”三妹精神煥發,沒有絲毫的疲憊。
“當然可以啊,你問。”我很欣賞三妹孜孜不倦的态度。
“構造方法真的不傳回任何值嗎?”
“構造方法雖然沒有傳回值,但傳回的是類的對象。”
“構造方法隻能完成字段初始化的工作嗎?”
“初始化字段隻是構造方法的一種工作,它還可以做更多,比如啟動線程,調用其他方法等。”
“好的,二哥,我的問題問完了,今天的學習可以結束了!”三妹一臉得意的樣子。
“那你記得複習下一節的内容哦,static 關鍵字。”感受到三妹已經學到了知識,我也很欣慰。