Java是一种面向对象的编程语言,它支持类的继承,即一个类可以从另一个类继承属性和方法。继承可以提高代码的复用性和可扩展性,但也带来了一些问题,比如构造函数的继承。
构造函数是一种特殊的方法,它用于创建类的实例,并初始化类的属性。构造函数的名字必须和类名相同,而且没有返回值。构造函数可以有参数,也可以没有参数,但不能被继承。
那么,如果一个类继承了另一个类,它的构造函数会怎样呢?答案是,子类必须显式地调用父类的构造函数,否则会报错。这是因为子类需要先初始化父类的属性,然后再初始化自己的属性。如果不调用父类的构造函数,父类的属性就没有被赋值,导致程序出错。
子类调用父类的构造函数有两种方式:一种是使用super关键字,在子类的构造函数中第一行写上super();或者super(参数);来调用父类的无参或有参构造函数。另一种是使用this关键字,在子类的构造函数中第一行写上this(参数);来调用子类自己的其他构造函数,而那个构造函数再调用父类的构造函数。
下面是一个简单的例子:
//定义一个父类Person
class Person {
String name;
int age;
//定义一个无参构造函数
Person() {
System.out.println("Person无参构造函数被调用");
}
//定义一个有参构造函数
Person(String name, int age) {
this.name = name;
this.age = age;
System.out.println("Person有参构造函数被调用");
}
}
//定义一个子类Student,继承自Person
class Student extends Person {
String school;
//定义一个无参构造函数
Student() {
super(); //调用父类的无参构造函数
System.out.println("Student无参构造函数被调用");
}
//定义一个有参构造函数
Student(String name, int age, String school) {
this(name, age); //调用本类的另一个有参构造函数
this.school = school;
System.out.println("Student有参构造函数被调用");
}
//定义另一个有参构造函数
Student(String name, int age) {
super(name, age); //调用父类的有参构造函数
System.out.println("Student另一个有参构造函数被调用");
}
}
//在主方法中创建子类对象并测试
public class Test {
public static void main(String[] args) {
Student s1 = new Student(); //创建一个无参对象
Student s2 = new Student("张三",18,"清华大学"); //创建一个有参对象
}
}
运行结果如下:
Person无参构造函数被调用
Student无参构造函数被调用
Person有参构造函数被调用
Student另一个有参构造函数被调用
Student有参构造函数被调用
从结果可以看出,每次创建子类对象时,都会先调用父类的构造函数,然后再调用子类的构造函数。这样可以保证父类和子类的属性都被正确地初始化。
总结一下,Java中的类在继承时不会继承父类的构造函数,但必须显式地调用父类的构造函数来初始化父类的属性。子类可以使用super或this关键字来调用父类或本类的构造函数,但必须放在子类构造函数的第一行。这样可以实现类的继承与构造函数的协调。
java相关课程推荐:java相关课程