实例化子类时为何执行父类与子类构造方法?构造方法未被继承
为什么实例化子类时父类构造方法会被调用(即使构造方法不被继承)?
先看你提供的代码:
测试类代码:
public static void main(String[] args){ Sub_Class s = new Sub_Class(); }
父类与子类代码:
public class Super_Class { public Super_Class(){ System.out.println("This is Parent Class's Constructor"); } } class Sub_Class extends Super_Class{ public Sub_Class(){ System.out.println("This is Child Class's Constructor"); } }
这问题问得很到位!虽然构造方法确实不会被子类继承,但Java在实例化子类对象的过程中,有一个默认机制会触发父类构造方法的执行,具体原因和过程是这样的:
- Java要求,子类对象在初始化自身之前,必须先完成父类部分的初始化。因为子类继承了父类的所有非私有成员(字段、方法等),如果父类的成员没有被正确初始化,子类调用这些成员时就会出现异常或错误。
- 当你编写子类的构造方法时,如果没有显式调用父类的构造方法(用
super()或者带参数的super(...)),Java编译器会自动在子类构造方法的第一行添加super();,这行代码的作用就是调用父类的无参构造方法。 - 所以你的子类构造方法其实等价于:
public Sub_Class(){ super(); // 编译器自动插入的代码 System.out.println("This is Child Class's Constructor"); }
- 这样一来,当你执行
new Sub_Class()时,程序会先执行super()调用父类构造,打印父类的输出内容,然后再执行子类构造方法里的代码,打印子类的内容,这就是为什么你会看到两行输出。
补充个小知识点:如果父类没有无参构造方法(比如父类只有带参数的构造),那你必须在子类构造方法的第一行显式调用父类的带参构造(比如super(xxx)),否则编译器会直接报错——因为它找不到可以自动调用的父类无参构造了。
内容的提问来源于stack exchange,提问作者Ahana
相关产品推荐
相关产品推荐

