重载
有些类有多个构造器。例如, 可以如下构造一个空的 StringBuilder 对象:
StringBuilder messages = new StringBuilderO;
StringBuilder todoList = new StringBuilderC'To do:\n";)
这种特征叫做重载(overloading。)
果多个方法(比如, StringBuilder 构造器方法)有 相同的名字、不同的参数, 便产生了重载。 编译器必须挑选出具体执行哪个方法, 它通过用 各个方法给出的参数类型与特定方法调用所使用的值类型进行匹配来挑选出相应的方法。 如 果编译器找不到匹配的参数, 就会产生编译时错误, 因为根本不存在匹配, 或者没有一个比 其他的更好。(这个过程被称为重载解析(overloading resolution)。)
: Java 允许重载任何方法, 而不只是构造器方法。 因此, 要完整地描述一个方法,
需要指出方法名以及参数类型。这叫做方法的签名(signature)。例如, String 类有 4 个 称为 indexOf 的公有方法。 它们的签名是
indexOf(int) indexOf(int, int) indexOf(String) indexOf(String, int)
返回类型不是方法签名的一部分。也就是说, 不能有两个名字相同、参数类型也相 同却返回不同类型值的方法。
默认域初始化
如果在构造器中没有显式地给域赋予初值, 那么就会被自动地赋为默认值: 数值为 0、 布尔值为 false、 对象引用为 nul。l
这是域与局部变量的主要不同点。 必须明确地初始化方法中的局部变量。 但是,
如果没有初始化类中的域, 将会被自动初始化为默认值(0、false 或 null
无参数的构造器
很多类都包含一个无参数的构造函数,
对象由无参数构造函数创建时, 其状态会设置为 适当的默认值。
例如, 以下是 Employee 类的无参数构造函数:
public Employee0 {
name =
salary = 0;
hireDay = LocalDate,now();
}
编写一个类时没有编写构造器, 那么系统就会提供一个无参数构造器。 这个构造 器将所有的实例域设置为默认值。 于是, 实例域中的数值型数据设置为 0、 布尔型数据设置 为 false、 所有对象变量将设置为 nul。l
仅当类没有提供任何构造器的时候, 系统才会提供一个默认的构造器 如果在编写类的时候, 给出了一个构造器, 哪怕是很简单的, 要想让这个类的用户能够 采用下列方式构造实例:
new ClassNameO
显式域初始化
通过重载类的构造器方法, 可以采用多种形式设置类的实例域的初始状态。 确保不管怎 样调用构造器, 每个实例域都可以被设置为一个有意义的初值, 这是一种很好的设计习惯。
可以在类定义中, 直接将一个值赋给任何域。例如:
class Employee
private String name = “”;
调用另一个构造器
关键字 this 引用方法的隐式参数。 然而, 这个关键字还有另外一个含义。
如果构造器的第一个语句形如 this(...), 这个构造器将调用同一个类的另一个构造器。
下 面是一个典型的例子:
public Employee(double s) {
// calls Employee(String, double)
this("Employee #" + nextld, s);
nextld++;
重载构造器
•用 this(...) 调用另一个构造器
•无参数构造器
•对象初始化块 •静态初始化块 •实例域初始化