## 重载
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. 执行这个构造器的主体.