共计 1523 个字符,预计需要花费 4 分钟才能阅读完成。
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 相关课程
原文地址: Java 类的继承与构造函数:你需要知道的一切