構造方法是方法名與類名相同的特殊方法,在新建對象時調用,可以通過不同的構造方法對對象進行不同的初始化創建,構造方法的特徵如下:
- 構造方法名稱必須與類名相同
- 構造方法沒有返回值類型,即使是void也不能有。它返回對象的地址,並賦值給引用變量。
- 構造方法不能被繼承,不能被覆寫,不能被直接調用。調用的途徑有三種,一是通過new關鍵字,二是在子類的構造方法中通過super調用父類的構造方法,三是通過反射方式獲取並使用。
- 類定義時提供了默認了無參構造方法,如果顯式地手動定義了有參構造方法,那麼默認提供的無參構造方法就會被覆蓋;如果依然想擁有無參構造方法,就需要自己手動去定義。
- 構造方法可以私有。那麼外部就不能使用私有構造方法創建對象。
在接口中不能定義構造方法,在抽象類中可以定義。在枚舉類中,構造方法是特殊的存在,它可以定義,但不能加public修飾,因爲它默認是private的,是絕對的單例,不允許外部以創建對象的方式生成枚舉對象。
一個類可以有多個參數不同的構造方法,構成構造方法的重載。
構造方法的使命就是在構造對象時進行傳參操作,所以不應該在構造方法中引入業務邏輯。
類中的static{...}被稱爲類的靜態代碼塊,在類初始化時執行,優先級很高,以下面代碼爲例:
class Parent{
static{ System.out.println("Parent 靜態代碼塊"); }
public Parent(){ System.out.println("Parent 構造方法"); }
}
class Son extends Parent{
static{ System.out.println("Son 靜態代碼塊"); }
son(){ System.out.println("Son 構造方法"); }
public static void main(String[] args){
new Son();
new Son();
}
}
執行結果如下
Parent 靜態代碼塊
Son 靜態代碼塊
Parent 構造方法
Son 構造方法
Parent 構造方法
Son 構造方法
從上面的示例可以看出,在創建類對象時,會先執行父類和子類的靜態代碼塊,然後再執行父類和子類的構造方法。
靜態代碼塊值運行一次,在第二次對象實例化時,不會運行。