Java構造函數(構造器)
構造函數是用於在對象創建後立即初始化對象的代碼塊。構造函數的結構看起來類似於一個方法。
聲明構造函數
構造函數聲明的一般語法是:
<Modifiers> <Constructor Name>(<parameters list>) throws <Exceptions list> {
}
構造函數的聲明以修飾符開頭。
構造函數可以將其訪問修飾符爲:public
,private
,protected
或package-level
(無修飾符)。
構造函數名稱與類的名稱相同。構造函數名稱後面是一對括號,可能包括參數。可選地,右括號後面可以是關鍵字throws
,其後面是逗號分隔異常列表。
以下代碼顯示了聲明類Test
的構造函數的示例。 類的名稱和構造函數的名稱必須匹配。
public class Test {
public Test() {
// Code goes here
}
}
與方法不同,構造函數沒有返回類型。
使用構造函數
使用一個帶有new
操作符的構造函數來在創建新實例之後初始化類的實例。使用new
運算符來創建一個對象,構造函數初始化該對象。
以下語句使用Test
類的構造函數來初始化Test
類的對象:
Test t = new Test();
以下代碼顯示瞭如何使用構造函數 -
class Cat {
public Cat() {
System.out.println("in constructor...");
}
}
public class Main {
public static void main(String[] args) {
// Create a Cat object and ignore its reference
new Cat();
// Create another Cat object and store its reference in c
Cat c = new Cat();
}
}
上面的代碼生成以下結果。
in constructor...
in constructor...
重載構造函數
一個類可以有多個構造函數。 它們稱爲重載構造函數。如果一個類有多個構造函數,它們的順序或參數類型都必須與其他構造函數不同。
下面的代碼聲明兩個構造函數。 一個構造函數不接受參數,另一個接受一個String
類型的參數。
class Car {
// Constructor #1
public Car() {
System.out.println("A car is created.");
}
// Constructor #2
public Car(String name) {
System.out.println("A car named " + name + " is created.");
}
}
public class Main {
public static void main(String[] args) {
Car d1 = new Car(); // Uses Constructor #1
Car d2 = new Car("My Car"); // Uses Constructor #2
}
}
上面的代碼生成以下結果。
每個對象創建表達式調用一次構造函數。可以在對象創建的過程中只執行一個構造函數的代碼一次。
從另一個構造函數調用構造函數
構造函數可以調用同一類中的另一個構造函數。考慮下面的Test
類。 它聲明兩個構造函數; 一個不接受參數,一個接受一個int
參數。
必須使用關鍵字this
從另一個構造函數調用另外一個構造函數。下面的代碼使用語句「this(1);
」從沒有參數的構造函數中調用具有int
參數的構造函數。
class Test {
Test() {
this(1); // OK. Note the use of the keyword this.
}
Test(int x) {
}
}
如果構造函數調用另一個構造函數,它必須是構造函數體中的第一個可執行語句。構造函數不能調用自身,因爲它將導致遞歸調用。
從構造函數返回
構造函數在其聲明中不能有返回類型。但可以在構造函數體中使用沒有返回表達式的return
語句。當一個構造函數中的返回語句被執行時,控制返回給調用者,忽略構造函數的其餘代碼。
以下代碼顯示了在構造函數中使用return
語句的示例。
class Test {
public Test(int x) {
if (x < 0) {
return;
}
System.out.println("here");
}
}
構造函數的訪問級別修飾符
構造函數的訪問級別決定了可以在對象創建表達式中使用該構造函數的程序。可以爲構造函數指定四個訪問級別之一:public
,private
,protected
和package-level
(不寫的情況)。下面的代碼聲明瞭Test
類的四個構造函數。
// Class Test has public access level
public class Test {
// Constructor #1 - Package-level access
Test() {
}
// Constructor #2 - public access level
public Test(int x) {
}
// Constructor #3 - private access level
private Test(int x, int y) {
}
// Constructor #4 - protected access level
protected Test(int x, int y, int z) {
}
}
具有公共(public
)訪問級別的構造函數可以在程序的任何部分中使用。具有私有(private
)訪問級別的構造函數只能在聲明它的同一類中使用。具有受保護(protected
)訪問級別的構造函數可以在具有聲明類的相同包的程序中以及在任何包中的任何子類中使用。具有包級訪問權限的構造函數可以在聲明其類的同一個包中使用。
默認構造函數
如果在定義類時,一個構造函數都不聲明,Java編譯器將向類添加一個構造函數。編譯器添加的構造函數稱爲默認構造函數。默認構造函數沒有任何參數。默認構造函數也稱爲無參數構造函數。如果類已經有一個構造函數,編譯器就不會添加任何構造函數。