11.3 再谈构造函数

与其他方法一样,构造函数也可重载,这意味着可提供形参不同的多个构造函数。Java 知道该调用哪个构造函数,这是根据你提供的实参确定的。

一种常见的做法是,在提供一个不接受任何参数的构造函数(如前面的构造函数)的同时,提供一个“值构造函数”,如下:

  1. public Time(int hour, int minute, double second) {
  2. this.hour = hour;
  3. this.minute = minute;
  4. this.second = second;
  5. }

这个构造函数所做的只是将形参的值复制到实例变量中。在这个实例中,形参的名称和类型与实例变量相同,因此形参将遮盖(shadow)或者说隐藏实例变量。为将它们区分开来,关键词 this 必不可少。让形参与相应的实例变量同名是一种常见的做法,但并非必须这样。

要调用这个构造函数,必须在运算符 new 后面提供实参。下面的示例创建了一个 Time 对象,这个对象表示的时间为正午前 0.1 秒:

  1. Time time = new Time(11, 59, 59.9);

重载构造函数可提供这样的灵活性,即先创建对象再填充属性或在创建对象本身前收集所有的信息。

一旦掌握构造函数的编写技巧,你就会觉得这样的工作很乏味。只需看一眼实例变量列表就能快速编写出构造函数。事实上,有些 IDE 都能替你生成构造函数。

将前面的代码整合起来,得到如下完整的类定义:

  1. public class Time {
  2. private int hour;
  3. private int minute;
  4. private double second;
  5. public Time() {
  6. this.hour = 0;
  7. this.minute = 0;
  8. this.second = 0.0;
  9. }
  10. public Time(int hour, int minute, double second) {
  11. this.hour = hour;
  12. this.minute = minute;
  13. this.second = second;
  14. }
  15. }