java中的構造方法是一種特殊型別的方法,用於初始化物件。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
值。
具有引數的建構函式稱為引數化建構函式。
問題: 為什麼使用引數化建構函式?
回答: 引數化建構函式用於為不同物件提供不同初始化的值。
引數化建構函式的範例
在這個例子中,我們建立了具有兩個引數的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中的一種技術,一個類可以有任何數量的引數列表不同的建構函式。編譯器通過建構函式引數列表中的引數數量及其型別來區分這些建構函式。
建構函式過載範例
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中沒有複製建構函式。但是可以將一個物件的值複製到另一個中,就像C++中的複製建構函式。
在java中有很多方法可以將一個物件的值複製到另一個物件中。它們分別是:
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: 可以建構函式執行其他任務而不是初始化?
回答: 是的,比如:物件建立,啟動執行緒,呼叫方法等。你可以像在方法中執行的任何操作一樣,在建構函式中也可以做到這些。