构造方法

Java类里有一种特殊的方法,叫构造方法constructor,用来构建对象并实现初始化

1. 一个简单的构造方法

例如前面章节所用到的Cat类,可以添加一个构造方法

public class Cat {
	
    // Cat的成员变量
    public int age = 0;
    public String name = "";
    public String owner = "";
    
    // 构造方法
    public Cat() {

    }
	
}

上面的代码添加了一个构造方法,只是目前该构造方法什么都没做。可以观察到,构造方法具有以下特征:

  • (1) 构造方法的方法名和类名相同
  • (2) 构造方法没有返回类型

关于构造方法的第二个特点,很好理解,因为它是用来“构建”Cat的对象并且初始化的,不需要返回什么;
关于构造方法的第一点:我们想要创建一个Cat的对象时,用

    Cat myCat = new Cat();

这里的new Cat()可以理解为调用了Cat的这个构造方法来创建myCat对象,这也是为什么称其为构造方法的原因。
然后我们可以在构造方法里做一些我们想在对象创建时就做的事情,比如初始化对象的属性:

public class Cat {
	
    // Cat的成员变量
    public int age = 0;
    public String name = "";
    public String owner = "";
    
    // 构造方法
    public Cat() {
        System.out.println("Cat consctructor: a cat object is created!");
        
        // 初始化age,假定cat在没有设定age时,它的年龄是1
        age = 1;
        
        // 初始化owner,假定cat在没有设定owner时,它属于SWUFE
        this.owner = "SWUFE";
    }
	
}

以上代码使用了this关键字:用来指明是这个对象的owner属性 等于 "SWUFE"。更多this关键词的用法参考Oracle官方文档.

2. 有参数表的构造方法

构造方法除了上面所说的两个特征外,与其他方法并无太大区别。我们同样可以构建带有参数表的构造方法,使得可以在构建对象时传入初始参数

例. 我们向上面的Cat类添加第二个构造方法,需要三个参数。

public class Cat {
	
    public int age = 0;
    public String name = "";
    public String owner = "";
    
	public Cat() {
		System.out.println("Cat consctructor: a cat object is created!");
		
		// 初始化age,假定cat在没有设定age时,它的年龄是1
		age = 1;
		
		// 初始化owner,假定cat在没有设定owner时,它属于SWUFE
		this.owner = "SWUFE";
	}
	
    // 添加第二个具有参数表的构造方法(方法的重载)
    // 并用传入的参数初始化对象的属性
	public Cat(int givenAge, String givenName, String givenOwner) {
		this.age = givenAge;
		this.name = givenName;
		this.owner = givenOwner;
	}
	
}

我们在创建Cat的对象时,可以直接使用这个构造方法传入age,name,和owner的参数:

    Cat mySecondCat = new Cat(3, "Leo", "lpzhang");

这样我们就创建了一只3岁叫Leo并且属于lpzhang的猫。


注. 当我们没有显式地定义任何构造方法时,Java会自动给类添加一个空的不含参数的构造方法。
比如如果Cat类这么定义(不存在我们定义的构造方法):

public class Cat {
	
    public int age = 0;
    public String name = "";
    public String owner = "";
	
}

那么Java就会自动给Cat类添加一个空的构造方法

    public Cat() {

    }

使得程序运行时实际的Cat类长这样:

public class Cat {
	
    public int age = 0;
    public String name = "";
    public String owner = "";
    
    // Java自动添加的构造方法
    public Cat() {

    }
	
}

这也意味着:如果我们显式地给Cat定义一个包含参数的构造方法,比如:

public class Cat {
	
    public int age = 0;
    public String name = "";
    public String owner = "";
    
    // 手动添加的包含参数的构造方法
    public Cat(int age) {
        this.age = age; // 这个对象的age属性等于传进来的参数(叫age)的值
    }
	
}

Java就不会自动添加一个空的不含参数的构造方法!此时如果尝试使用

    Cat cat = new Cat();

来创建一个cat对象,Java就会报错:The constructor Cat() is undefined。