零基礎學Java(14)對象構造
對象構造
之前學習了編寫簡單的構造器,可以定義對象的初始狀態。但是,由於對象構造非常重要,所以Java提供了多種編寫構造器的機制。
重載
有些類有多個構造器。例如,可以如下構造一個空的StringBuilder
對象:
var messages = new StringBuilder();
或者,可以指定一個初始字元串:
var todoList = new StringBuilder("To do:\n");
這種功能叫做重載。如果多個方法有相同的名字、不同的參數,便出現了重載。編譯器必須挑選出具體調用哪個方法。它用各個方法首部中的參數類型與特定方法調用中所使用的的值類型進行匹配,來選出正確的方法。如果編譯器找不到匹配的參數,就會產生編譯時錯誤,因為根本不存在匹配,或者沒有一個比其他的更好(這個查找匹配的過程被稱為重載解析)
默認欄位初始化
如果在構造器中沒有顯式地為欄位設置初始值,那麼就會被自動地賦為默認值:數值為0,布爾值為false
,對象引用為null
靜態初始化塊
如果類的靜態欄位需要很複雜的初始化程式碼,那麼可以使用靜態的初始化塊。
將程式碼放在一個塊中,並標記關鍵字static
。下面給出一個示例。其功能是將員工ID的起始值賦予一個小於1000的隨機整數
// 靜態初始化塊
static {
var generator = new Random();
nextId = generator.nextInt(1000);
}
在類第一次載入的時候,將會進行靜態欄位的初始化。與實例欄位一樣,除非將靜態欄位顯式地設置成其他值,否則默認的初始值是0、false或null。所有的靜態欄位初始化方法以及靜態初始化塊都將依照類聲明中出現的順序執行。
實戰
下面的程式會展示很多特性
- 重載構造器
- 用
this(...)
調用另一個構造器 - 無參數構造器
- 對象初始化塊
- 靜態初始化塊
- 實例欄位初始化
import java.util.Random;
public class ConstructorTest {
public static void main(String[] args) {
Employee2[] staff = new Employee2[3];
staff[0] = new Employee2("Harry", 40000);
staff[1] = new Employee2(60000);
staff[2] = new Employee2();
for (Employee2 e: staff) {
System.out.println("name=" + e.getName() + ", id=" + e.getId() + ", salary=" + e.getSalary());
}
}
}
class Employee2 {
private static int nextId;
private int id;
private String name = "";
private double salary;
// 靜態初始化塊
static {
Random generator = new Random();
// 設置在0-9999之間的隨機數變數nextId
nextId = generator.nextInt(10000);
}
// 對象初始化塊
{
id = nextId;
nextId++;
}
/**
* 3個重載構造函數
*/
public Employee2(String n, double s) {
this.name = n;
this.salary = s;
}
public Employee2(double s) {
this("新名字" + nextId, s);
}
public Employee2() {}
public String getName() {
return name;
}
public double getSalary() {
return salary;
}
public int getId() {
return id;
}
}
運行結果如下:
name=Harry, id=2775, salary=40000.0
name=新名字2776, id=2776, salary=60000.0
name=, id=2777, salary=0.0