天天看點

教妹學Java(二十五):搞懂 Java 中的構造方法(2)

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 關鍵字。”感受到三妹已經學到了知識,我也很欣慰。