MST

星途 面试题库

面试题:Java抽象类继承与构造函数相关误区

考虑以下Java代码: abstract class Parent { Parent(int num) { System.out.println("Parent constructor with num: " + num); } } class Child extends Parent { Child() { super(10); System.out.println("Child constructor"); } } 有人认为在创建Child类实例时,会直接调用Child的构造函数而忽略Parent的构造函数。请分析这种理解是否正确,并阐述Java中抽象类在继承体系下构造函数调用的原理,以及可能存在的误区。
37.8万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

这种理解是不正确的。

Java中抽象类在继承体系下构造函数调用的原理

  1. 构造函数调用顺序:在Java中,当创建一个子类实例时,会首先调用其父类的构造函数,然后再调用子类自身的构造函数。这是因为子类对象包含了父类对象的部分,需要先初始化父类部分。
  2. 使用super关键字:在子类构造函数中,通过super关键字来显式调用父类的构造函数。如果子类构造函数中没有显式调用super,Java编译器会自动在子类构造函数的第一行插入super(),调用父类的无参构造函数。如果父类没有无参构造函数,那么子类构造函数就必须显式调用父类合适的构造函数,否则会编译错误。

可能存在的误区

  1. 认为可以跳过父类构造函数:如题目中所认为的直接调用子类构造函数而忽略父类构造函数是错误的。父类的初始化是子类初始化的基础,必须先完成。
  2. super关键字的误解:有些人可能不理解super关键字的作用和使用规则,不知道在子类构造函数中需要恰当使用它来调用父类构造函数。同时,可能会忘记如果不显式调用super,编译器会自动插入对父类无参构造函数的调用,而当父类没有无参构造函数时就会导致问题。