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