【发布时间】:2016-05-26 09:22:16
【问题描述】:
当从基类的构造函数调用被覆盖的方法时,根据运行时多态性概念,子类中定义的方法也会被调用。我想知道这是如何在 JVM 中处理的,当控制在基类构造函数中时,子类的构造函数尚未被调用,因此 Object 尚未完全构造。
我了解从基类构造函数调用覆盖方法的不良影响,但只是想了解这是如何实现的。
我觉得堆中的对象是在调用构造函数之前创建的,并且在调用构造函数时,属性会被初始化。请提供您对上述内容的宝贵意见。
下面是演示相同的代码。
Base.java
public class Base {
public Base() {
System.out.println("Base constructor is executing...");
someMethod();
}
public void someMethod() {
System.out.println("someMethod defined in Base class executing...");
}
}
Sub.java
public class Sub extends Base{
public Sub() {
System.out.println("Sub constructor is executing...");
}
@Override
public void someMethod() {
System.out.println("someMethod defined in Sub class executing...");
}
}
Client.java
public class Client {
public static void main(String[] args) {
Sub obj = new Sub();
}
}
控制台输出
基础构造函数正在执行...
在子类中定义的someMethod正在执行...
子构造函数正在执行...
【问题讨论】:
-
简短的回答是肯定的。使用
dup操作码创建新对象实例,仅在此之后调用构造函数。您也可以创建自己的对象而无需调用构造函数,例如使用反序列化。 -
@nits.kk,看看这篇文章:artima.com/designtechniques/initializationP.html
标签: java inheritance constructor heap-memory