## 重載
java允許重載任何方法,而不只是構造器方法.因此,要完整的描述一方法,需要指出方法名以及參數類型.這叫做方法的簽名(signature).也就是說在java中方法重載不關注返回值,只關心方法名和參數的類型個數.
編譯器必須挑選出具體執行哪個方法, 它通過用 各個方法給出的參數類型與特定方法調用所使用的值類型進行匹配來挑選出相應的方法。 如 果編譯器找不到匹配的參數, 就會產生編譯時錯誤, 因為根本不存在匹配, 或者沒有一個比 其他的更好。(這個過程被稱為重載解析(overloading resolution)。)
## 默認域初始化
如果在構造器中沒有顯示的給域賦予初值,那么就會被自動的賦為默認值:數值為0,布爾值為false,對象引用為null.只有缺少程序設計經驗的人才會這樣做.
## 無參數的構造器
很多類都包含一個無參數的狗仔函數,對象由無參數構造函數創建時,其狀態會設置為適當的默認值.如下:
~~~
public class Employee
{
public Employee()
{
name = "";
salary = 0;
hireDay = LocalDate.now();
}
}
~~~
如果在編寫一個類時沒有編寫構造器,那么系統就會提供一個無參數構造器.這個構造器將所有的實例域設置為默認值.于是,實例域中的數值型數據設置為0,布爾型數據設置為false,所有對象變量將設置為null.
如果類中提供了至少一個構造器,但是沒有提供無參數的構造器,則在狗仔對象時如果沒有提供參數就會被視為不合法:
```
Employee(String name, double salary, int y, int ra, int d)
```
對于這個類, 構造默認的雇員屬于不合法。 也就是, 調用
```
e = new Eraployee();
```
將會產生錯誤.
注意:只有類沒有提供任何構造器的時候,系統才會提供一個默認的構造器.
## 顯示域初始化
~~~
public class Employee
{
private static int nextId;
private int id = assignId(); //通過這種方式進行賦值
private static int assignId()
{
int r = nextId;
nextId++;
return r;
}
public int getId()
{
return this.id;
}
}
~~~
## 調用另一個構造器
關鍵字this引用方法的隱式參數.然而,這個關鍵字還有另一個含義.如果構造器的第一個語句(必須是第一行)形如this(...) ,這個構造器將調用同一個的另一個構造器.
~~~
public class Employee
{
private String name;
private int age;
public static int nextId;
public Employee(int n)
{
this("jack", 20);
nextId++;
}
public Employee(String name, int age)
{
this.name = name;
this.age = age;
}
}
~~~
## 調用構造器具體步驟
1. 所有數據域被初始化為默認值(0,false或null).
2. 按照在類聲明中出現的次序,依次執行所有域初始化語句和初始化塊.
3. 如果構造器第一行調用了第二個構造器,則執行第二個構造器主體.
4. 執行這個構造器的主體.