类的构造方法

在类中,除成员方法外,还存在一种特殊类型的方法,那就是构造方法。构造方法是一个与类同名的方法,对象的创建就是通过构造方法完成的。每当类实例化一个对象时,类都会自动调用构造方法。

构造方法的特点如下:

  • 构造方法没有返回值。

  • 构造方法的名称要与本类的名称相同。

在定义构造方法时,构造方法没有返回值,但这与普通没有返回值的方法不同,普通没有返回值的方法使用 public void methodEx() 这种形式进行定义,但构造方法并不需要使用 void 关键字进行修饰。

构造方法的定义语法格式如下:

public Book() {
    ...         // 构造方法体
}
  • public:构造方法修饰符。

  • Book:构造方法的名称。

在构造方法中可以为成员变量赋值,这样当实例化一个本类对象时,相应的成员变量也将被初始化。如果类中没有明确定义构造方法,编译器会自动创建一个不带参数的默认构造方法。

如果在类中定义的构造方法都不是无参的构造方法,那么编译器也不会为类设置一个默认的无参构造方法,当试图调用无参构造方法实例化一个对象时,编译器会报错。因此,只有在类中没有定义任何构造方法时,编译器才会在该类中自动创建一个不带参数的构造方法。

在6.2.6节中介绍过 this 关键字,了解了 this 可以调用类的成员变量和成员方法,事实上 this 还可以调用类中的构造方法,看下面的实例。

【例6.3】“构造”鸡蛋灌饼(实例位置:资源包\TM\sl\6\3)

当顾客购买鸡蛋灌饼时:如果要求加两个蛋,店家就给饼加两个蛋;不要求时,店家会默认给饼加一个蛋。创建鸡蛋灌饼类(EggCake 类),使用 this 关键字,在无参构造方法中调用有参构造方法,实现上述加蛋过程。代码如下:

public class EggCake {
	int eggCount; // 鸡蛋灌饼里蛋的个数

	public EggCake(int eggCount) { // 参数为鸡蛋灌饼里蛋的个数的构造方法
		this.eggCount = eggCount; // 将参数eggCount的值付给属性eggCount
	}

	public EggCake() { // 无参数构造方法,默认给饼加一个蛋
		// 调用参数为鸡蛋灌饼里蛋的个数的构造方法,并设置鸡蛋灌饼里蛋的个数为1
		this(1);
	}

	public static void main(String[] args) {
		EggCake cake1 = new EggCake();
		System.out.println("顾客不要求加蛋的数量,饼里会有" + cake1.eggCount + "个蛋。");
		EggCake cake2 = new EggCake(2);
		System.out.println("顾客要求加2个蛋,饼里会有" + cake2.eggCount + "个蛋。");
	}
	
}

运行结果如下:

     顾客不要求加蛋的数量,饼里会有1个蛋。
     顾客要求加2个蛋,饼里会有2个蛋。

编程训练(答案位置:资源包\TM\sl\6\编程训练)

【训练3】买可乐 张三去KFC买可乐,商家默认不加冰块,但是张三可以要求加3个冰块。请利用构造方法实现上述功能。

【训练4】设置信用卡密码 创建信用卡类,有两个成员变量,分别是卡号和密码,如果用户开户时没有设置初始密码,则使用“123456”作为默认密码。设计两个不同的构造方法,分别用于用户设置密码和用户未设置密码两种构造场景。