构造方法
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。