面试题答案
一键面试构造函数链的形成
在Java类继承体系中,当创建一个子类对象时,会从子类的构造函数开始,沿着继承链向上调用父类的构造函数,直至调用到Object
类的构造函数,这样就形成了构造函数链。这是因为每个类的构造函数在执行时,默认会先调用其父类的无参构造函数(如果存在),以确保父类部分的对象先被正确初始化。
super
关键字在构造函数中的作用
- 调用父类构造函数:
super
关键字最主要的作用是在子类构造函数中显式调用父类的构造函数,可调用父类的无参构造函数或带参数的构造函数。 - 访问父类成员:在子类中访问父类被隐藏的成员变量和方法,但这不是在构造函数中的主要应用。
代码示例
class Animal {
private String name;
public Animal(String name) {
this.name = name;
System.out.println("Animal constructor: " + name);
}
}
class Dog extends Animal {
private int age;
public Dog(String name, int age) {
// 通过super调用父类的构造函数
super(name);
this.age = age;
System.out.println("Dog constructor: age " + age);
}
}
public class Main {
public static void main(String[] args) {
Dog dog = new Dog("Buddy", 3);
}
}
在上述代码中:
Animal
类有一个带参数的构造函数,用于初始化name
变量。Dog
类继承自Animal
类,其构造函数通过super(name)
调用了父类Animal
带参数的构造函数,先完成父类部分的初始化。- 然后
Dog
类构造函数再初始化自身特有的age
变量。 - 在
main
方法中创建Dog
对象时,构造函数链的调用顺序为:先调用Animal
类的构造函数,再调用Dog
类的构造函数,从而完成对象的正确初始化。