当前位置:   article > 正文

继承与无参构造器

继承与无参构造器

下面是一个将这三个类放在同一个文件中的示例:

  1. public class Test {
  2. public static void main(String[] args) {
  3. Student s1 = new Student();
  4. }
  5. }
  6. class Student extends Person {
  7. public Student() {
  8. System.out.println("Student()无参构造器后执行了");
  9. super(); // 实际上这行代码是隐式的,但显式写出可以增加代码可读性
  10. }
  11. }
  12. class Person {
  13. public Person() {
  14. System.out.println("Person()无参构造器先执行");
  15. }
  16. }
  1. 我将StudentPerson类定义为非public的,因为在一个文件中只能有一个public类,并且它的名称必须与文件名相同。如果你希望它们都是public的,你需要将它们放在不同的文件中。
  2. 我添加了super();Student的构造器中。虽然它是隐式调用的(如果父类没有提供其他构造器),但显式地写出它可以增加代码的可读性。
  3. 类之间用空行分隔,以提高代码的可读性。这不是必须的,但通常是个好习惯。

我们来看看输出结果:

  1. Person()无参构造器先执行
  2. Student()无参构造器后执行了

为什么先输出了“Person()无参构造器先执行”


在Java中,当你创建一个子类的实例时,如果子类构造函数没有显式地调用父类的构造函数,那么编译器会自动插入一个对父类无参构造函数的调用(如果父类中存在这样的构造函数)。这是Java中构造函数链式调用的一个基本规则,确保父类在子类之前被正确初始化。


当你创建Student类的实例时new Student(),会首先调用Student的构造函数。但是,由于Student类继承了Person类,所以在Student的构造函数执行之前,编译器会自动先调用Person类的无参构造函数(如果存在)。这就是为什么首先输出了"Person()无参构造器先执行"。

Student的构造函数内部,你输出了"Student()无参构造器后执行了",这是在Person的构造函数执行之后发生的。因此,整个输出顺序是先父类后子类。

这个过程是Java中对象初始化的一个重要部分,确保在子类访问或修改从父类继承的任何状态之前,父类已经完成了其自己的初始化。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/667520
推荐阅读
相关标签
  

闽ICP备14008679号