当从基类的构造函数调用重写方法时,根据运行时多态性概念,调用子类中定义的方法。我想知道如何在JVM中处理这个问题,当控件在基类构造函数中时,子类的构造函数尚未被调用,因此Object尚未完全构造。
我理解从基类构造函数调用overriden方法的不良影响,但只是希望了解如何使其成为可能。
我感觉堆中的对象是在调用构造函数之前创建的,并且在调用构造函数时,属性被初始化。请为上述内容提供宝贵的意见。
以下是展示相同内容的代码。
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();
}
}
控制台上的输出
基础构造函数正在执行......
在Sub类执行中定义的someMethod ...
子构造函数正在执行...
答案 0 :(得分:5)
是否在调用Constructor之前创建了java中的对象?
是的,否则您将无法初始化对象。
在字节代码级别,首先创建对象,然后调用构造函数,传入对象以进行初始化。构造函数的内部名称为<init>
,它的返回类型始终为void
,这意味着它不会返回对象,只会初始化它。
注意:Unsafe.allocateInstance
将在不调用构造函数的情况下创建对象,对于反序列化非常有用。