本帖最后由 黄克帅 于 2012-5-26 19:20 编辑
子类中的所有构造函数,都会默认调用父类的无参构造函数,因为在子类所有构造函数的第一行有隐式的代码:super();
如果父类中定义了有参的构造函数,则必须在子类中显式的掉用父类的有参构造函数,或者在父类中添加显式的无参构造函数。不然会报错。 因为这个时候父类系统默认的无参数构造函数已经不存在了
当然也可以在子类中的第一行手动用this语句来访问子类的构造函数,但是子类中至少有一个构造函数访问父类的构造函数。
public class Person {
public int age;
public String name;
Person() {
System.out.println("打印父类无参数构造函数");
}
Person(int age) {
this.age = age;
System.out.println("打印父类有一个参数构造函数");
}
public Person(int age, String name) {
this.age = age;
this.name = name;
System.out.println("打印父类两个参数的构造函数");
}
}
public class Student extends Person {
private int age;
public String name;
Student() {
// 这里有一行隐藏代码super();
System.out.println("打印子类无参数构造函数");
}
Student(int age) {
// 这里有一行隐藏代码super(); 当然手动指定了父类的构造函数,就不存在了
super(age); // 通过super指定访问父类的构造函数
this.age = age;
System.out.println("打印子类有一个参数构造函数");
}
public Student(int age, String name) {
// 这里有一行隐藏代码super(); 当然手动指定访问子类自己的构造函数,就不存在了
this(age);// 通过this语句来指定访问子类自己的构造函数,但是不管怎么样都会有一个构造函数访问父类的构造函数
this.age = age;
this.name = name;
System.out.println("打印子类两个参数的构造函数");
}
}
public class Test {
public static void main(String[] args) {
Student s = new Student();
// 这里执行后打印 打印父类无参数构造函数
// 打印子类无参数构造函数
Student s1 = new Student(1);
// 这里执行后打印 打印父类有一个参数构造函数
// 打印子类有一个参数构造函数
Student s2 = new Student(1, "zhansan");
// 这里执行后打印 打印父类有一个参数构造函数
// 打印子类有一个参数构造函数
// 打印子类两个参数的构造函数
}
} |