构造器是一个特殊的方法,这个特殊方法用于创建实例时执行初始化。构造器是创建对象的重要途径(即使使用工厂模式、反射灯方式创建对象,其实质依赖于构造器),因此,Java 类必须包含一个或一个以上的构造器。
1,使用构造器执行初始化
构造器最大的用处就是在创建对象时执行初始化。前面已经介绍过了,当创建一个对象时,系统为这个队的 Field 进行默认初始化,这种默认的初始化把所有基本类型的 Field 设为0 (对数值型 Field)或 false (对布尔型 Field),把所有引用类型的 Field 设为 null。
如果想改变这个默认的初始化,想让系统创建队形时就为该对象的 Field 显示指定初始值,就可以通过构造器来实现。
(如果程序员没有为 Java 类提供任何构造器,则系统会为这个类提供一个无参数的构造器,这个构造器的执行体为空,不做任何事情。无论如何,Java 类至少包含一个构造器。)
- package com.sym.test;
- public class ConstructorTest {
- public String name;
- public int count;
- //提供自定义的构造器,该构造器包含两个参数
- public ConstructorTest(String name, int count){
- //构造器里的this 代表它进行初始化的对象
- //下面两行代码将传入的2个参数赋给this代表对象
- this.name = name;
- this.count = count;
- }
- public static void main(String[] args) {
- //使用自定义的构造器来创建对象
- //系统将会对该对象执行自定义的初始化
- ConstructorTest to = new ConstructorTest("Java", 9000);
- //输出ConstructorTest对象的name 和 count 两个 Field
- System.out.println(to.name);
- System.out.println(to.count);
- }
- }
package com.sym.test;public class ConstructorTest { public String name; public int count; //提供自定义的构造器,该构造器包含两个参数 public ConstructorTest(String name, int count){ //构造器里的this 代表它进行初始化的对象 //下面两行代码将传入的2个参数赋给this代表对象 this.name = name; this.count = count; } public static void main(String[] args) { //使用自定义的构造器来创建对象 //系统将会对该对象执行自定义的初始化 ConstructorTest to = new ConstructorTest("Java", 9000); //输出ConstructorTest对象的name 和 count 两个 Field System.out.println(to.name); System.out.println(to.count); }}运行上面程序,将看到输出 ConstructorTest 对象时, 它的 name 实例 Field 不再是 null,而且 count 实例 Field 也不再是0,这就是提供自定义构造器的作用。
一旦程序员提供了自定义的构造器,系统就不再提供默认的构造器,因此上面的 ConstructorTest类不能再通过 new ConstrutorTest() 代码来创建实例,因为该类不再包含无参数的构造器。
2,构造器重载
同一个类里具有多个构造器,多个构造器的形参列表不同,即被称为构造器重载。
- package com.sym.test;
- public class ConstructorOverload {
- public String name;
- public int count;
- //提供无参数的构造器
- public ConstructorOverload(){}
- //提供带两个参数的构造器
- //对该构造器返回的对象执行初始化
- public ConstructorOverload(String name, int count){
- this.name = name;
- this.count = count;
- }
- public ConstructorOverload(String name){
- this.name = name;
- }
- public static void main(String[] args) {
- //通过无参数构造器创建 ConstructorOverload 对象
- ConstructorOverload oc1 = new ConstructorOverload();
- //通过有参数构造器创建 ConstructorOverload 对象
- ConstructorOverload oc2 = new ConstructorOverload("Java", 1000);
- System.out.println(oc1.name + " " + oc1.count);
- System.out.println(oc2.name + " " + oc2.count);
- }
- }
package com.sym.test;public class ConstructorOverload { public String name; public int count; //提供无参数的构造器 public ConstructorOverload(){} //提供带两个参数的构造器 //对该构造器返回的对象执行初始化 public ConstructorOverload(String name, int count){ this.name = name; this.count = count; } public ConstructorOverload(String name){ this.name = name; } public static void main(String[] args) { //通过无参数构造器创建 ConstructorOverload 对象 ConstructorOverload oc1 = new ConstructorOverload(); //通过有参数构造器创建 ConstructorOverload 对象 ConstructorOverload oc2 = new ConstructorOverload("Java", 1000); System.out.println(oc1.name + " " + oc1.count); System.out.println(oc2.name + " " + oc2.count); }}
下面代码实现了在一个构造器中直接使用另一个构造器的初始化代码。
- package com.sym.test;
- public class Apple {
- public String name;
- public String color;
- public double weight;
- public Apple(){}
- //两个参数的构造器
- public Apple(String name, String color){
- this.name = name;
- this.color = color;
- }
- //三个参数的构造器
- public Apple(String name, String color, double weight){
- //通过 this 调用另一个重载的构造器的初始化代码
- this(name, color);
- //下面 this 引用该构造器正在初始化的 Java 对象
- this.weight = weight;
- }
- }
package com.sym.test;public class Apple { public String name; public String color; public double weight; public Apple(){} //两个参数的构造器 public Apple(String name, String color){ this.name = name; this.color = color; } //三个参数的构造器 public Apple(String name, String color, double weight){ //通过 this 调用另一个重载的构造器的初始化代码 this(name, color); //下面 this 引用该构造器正在初始化的 Java 对象 this.weight = weight; }}
上面的 Apple 类里包含了三个构造器,其中第三个构造器通过this来调用另一个重载构造器的初始化代码。程序中this(name, color): 调用表名调用该类另一个有两个字符串参数的构造器。
使用this 调用另一个重载的构造器只能在构造器中使用,而且必须作为构造器执行体的第一条语句。使用this 调用重载的构造器时,系统会根据 this 后括号里的实参来调用形参列表与之对应的构造器。(好处是,代码好维护,不需要更改大量代码。)