java - 如果我们创建一个子类的对象,会不会有父类的对象创建?

标签 java inheritance

我知道每次创建子类对象都会调用super。但是,我特别想知道的是它会加载类还是会创建该父类的对象。

提前致谢。

最佳答案

您有一个单个对象。
当一个类被实例化时,它首先调用父类的构造函数。对于每个父类,它遵循相同的逻辑:它首先调用父类的构造函数。

假设:A 扩展B 扩展C

new A() 导致 B 构造函数调用,该构造函数自身调用 C 构造函数。
作为 C 然后返回 B 构造函数调用,A 构造函数可以继续并创建实例 A

But, what I specifically want to know is that will it load the class or will it create the object of that parent class.

类似于构造函数的执行,在加载一个类之前,必须首先加载它的父类,然后递归地为每个父类加载。

这里对应于 A extends B extends C 的类:

class C {
    public C(){    
        System.out.println("C constructor");
    }
}

class B extends C{
    public B() {
        System.out.println("B constructor");
    }

}
class A extends B{
    public A() {
        System.out.println("A constructor");
    }
}


public class Test {
    public static void main(String[] args) {
        new A();
    }
}

编译这些类,然后执行 Test 类,该类通过指定 在其 main() 方法中创建一个 A 实例java 命令中的 -verbose 标志(默认情况下启用类日志):

java -verbose Test

你应该在输出标准中看到如下内容:

[Loaded java.lang.Object from C:\...]
[Loaded java.io.Serializable from C:\...]
... // load all classes required until loaded C, B and A classes
[Loaded C from file:/C:/...]
[Loaded B from file:/C:/...]
[Loaded A from file:/C:/...]
C constructor
B constructor
A constructor

它确认:

  • 首先需要加载父类,从根父类(Object)开始,直到最近的父类(B)。
  • 在加载层次结构的所有类之前不执行构造函数
  • 父类的构造函数总是在实例化类的构造函数之前执行,从根父构造函数(Object)开始,直到最近的父构造函数(B) ).

关于java - 如果我们创建一个子类的对象,会不会有父类的对象创建?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49627652/

相关文章:

java - 在 Java 程序上保留一个类是一个好方法吗?

java - 我不确定我是否理解 java 中的可序列化是如何工作的

c# - 固有实现的接口(interface)

linux - 使用继承时覆盖 Puppet 类

linux - java 。 Log4j。 openjdk-7。问题看起来像无限循环

java - 如何使用 Solr 或 Searchable 搜索域对象及其指向的物理文件

java - 使用 itext java 使用自定义字体编写特殊字符

来自多个类的 C++ 多态性

python - 如何为独立指标和相关指标创建Python类?

c++ - 菱形继承(钻石问题)和纯虚函数