java中的構造方法是一種特殊類型的方法,用於初始化對象。Java構造函數在對象創建時被調用。 它構造值,即提供對象的數據,這是為什麼它被稱為構造函數。
創建java構造函數的規則
構造函數基本上定義了兩個規則。它們分別如下 -
- 構造函數名稱必須與其類名稱相同
- 構造函數必須沒有顯式返回類型
Java構造函數的類型
有兩種類型的構造函數:
- 默認構造函數(無參數構造函數)
- 參數化構造函數

1. Java默認構造函數(無參數構造函數)
沒有參數的構造函數稱為默認構造函數。默認構造函數的語法如下:
<class_name>(){}
默認構造函數的示例:
在這個例子中,在Bike類中創建了無參數(no-arg)構造函數。它將在對象創建時被調用。
class Bike1 {
    Bike1() {
        System.out.println("Bike is created");
    }
    public static void main(String args[]) {
        Bike1 b = new Bike1();
    }
}
上面的示例代碼運行結果如下 -
Bike is created
規則:如果類中沒有構造函數,編譯器會自動創建一個默認構造函數。
問題: 默認構造函數的目的是什麼?
默認構造函數根據類型為對象提供默認值,如:0,null等。
顯示默認值的默認構造函數示例
class Student3 {
    int id;
    String name;
    void display() {
        System.out.println(id + " " + name);
    }
    public static void main(String args[]) {
        Student3 s1 = new Student3();
        Student3 s2 = new Student3();
        s1.display();
        s2.display();
    }
}
運行上面代碼,得到如下結果 -
0 null
0 null
解釋: 在上面的類中,代碼中並沒有創建任何構造函數,但編譯器自動提供了一個默認構造函數。默認構造函數分別為字段:id 和 name 分別提供了0和null值。
2. Java參數化構造函數
具有參數的構造函數稱為參數化構造函數。
問題: 為什麼使用參數化構造函數?
回答: 參數化構造函數用於為不同對象提供不同初始化的值。
參數化構造函數的示例
在這個例子中,我們創建了具有兩個參數的Student類的構造函數。構造函數中柯有任意數量的參數。
class Student4 {
    int id;
    String name;
    Student4(int i, String n) {
        id = i;
        name = n;
    }
    void display() {
        System.out.println(id + " " + name);
    }
    public static void main(String args[]) {
        Student4 s1 = new Student4(111, "Karan");
        Student4 s2 = new Student4(222, "Aryan");
        s1.display();
        s2.display();
    }
}
運行上面代碼,得到如下結果 -
111 Karan
222 Aryan
Java構造函數重載
構造方法重載是Java中的一種技術,一個類可以有任何數量的參數列表不同的構造函數。編譯器通過構造函數參數列表中的參數數量及其類型來區分這些構造函數。
構造函數重載示例
class Student5 {
    int id;
    String name;
    int age;
    Student5(int i, String n) {
        id = i;
        name = n;
    }
    Student5(int i, String n, int a) {
        id = i;
        name = n;
        age = a;
    }
    void display() {
        System.out.println(id + " " + name + " " + age);
    }
    public static void main(String args[]) {
        Student5 s1 = new Student5(111, "Karan");
        Student5 s2 = new Student5(222, "Aryan", 25);
        s1.display();
        s2.display();
    }
}
上面示例代碼,執行後輸出結果如下 -
111 Karan 0
222 Aryan 25
java的構造函數和方法之間的區別
構造函數和方法之間有許多區別,它們如下面列出 -
| Java構造函數 | Java方法 | 
|---|---|
| 構造器用於初始化對象的狀態(數據)。 | 方法用於暴露對象的行為。 | 
| 構造函數不能有返回類型。 | 方法一般都有返回類型。 | 
| 構造函數隱式調用。 | 方法要顯式調用。 | 
| 如果沒有指定任何構造函數,java編譯器提供一個默認構造函數。 | 在任何情況下編譯器都不會提供默認的方法調用。 | 
| 構造函數名稱必須與類名稱相同。 | 方法名稱可以或可以不與類名稱相同(隨意)。 | 
Java拷貝構造函數
在Java中沒有複製構造函數。但是可以將一個對象的值複製到另一個中,就像C++中的複製構造函數。
在java中有很多方法可以將一個對象的值複製到另一個對象中。它們分別是:
- 通過構造函數
- 通過將一個對象的值分配給另一個對象
- 通過Object類的clone()方法
在這個例子中,使用java構造函數將一個對象的值複製到另一個對象中。
class Student6 {
    int id;
    String name;
    Student6(int i, String n) {
        id = i;
        name = n;
    }
    Student6(Student6 s) {
        id = s.id;
        name = s.name;
    }
    void display() {
        System.out.println(id + " " + name);
    }
    public static void main(String args[]) {
        Student6 s1 = new Student6(111, "Karan");
        Student6 s2 = new Student6(s1);
        s1.display();
        s2.display();
    }
}
上面示例代碼,執行後輸出結果如下 -
111 Karan
111 Karan
不使用構造函數複製值
可以通過將對象值分配給另一個對象,將一個對象的值複製到另一個對象中。 在這種情況下,不需要創建構造函數。
class Student7 {
    int id;
    String name;
    Student7(int i, String n) {
        id = i;
        name = n;
    }
    Student7() {
    }
    void display() {
        System.out.println(id + " " + name);
    }
    public static void main(String args[]) {
        Student7 s1 = new Student7(111, "Karan");
        Student7 s2 = new Student7();
        s2.id = s1.id;
        s2.name = s1.name;
        s1.display();
        s2.display();
    }
}
上面示例代碼,執行後輸出結果如下 -
111 Karan
111 Karan
問題1: 構造函數有返回值 ?
回答: 是的,構造函數返回當前類的實例(不能指定返回值類型,但它會返回一個值)。
問題2: 可以構造函數執行其他任務而不是初始化?
回答: 是的,比如:對象創建,啟動線程,調用方法等。你可以像在方法中執行的任何操作一樣,在構造函數中也可以做到這些。
