Java类的继承与构造函数:你需要知道的一切

2023-06-27 11:40:37 浏览数 (2161)

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相关课程