java - 在 B 继承自 A 的情况下创建了多少个对象?

标签 java inheritance polymorphism

这里有两个类,

class A
{
}
class B extends A
{
}

A继承自B。令我困惑的是,当我使用以下代码时,创建了多少个对象

A a =  new B();

我知道当我创建一个B的实例时,它会先调用A的构造函数,然后再调用B的构造函数' s.
调用A的构造函数时是否创建了A的实例?

中创建了多少个对象
A a = new B();

最佳答案

它创建一个对象,它是 B 的一个实例。当 A 构造函数执行时,它已经是一个 B 了,如果您将代码更改为:

class A {
    public A() {
        System.out.println(getClass());
    }
}

class B extends A {
}

...

A a = new B(); // Prints B in the A constructor

基本上,构造函数不是创建对象的东西 - 它是初始化该类上下文中的对象的东西。

所以你可以把这些步骤想成:

  • 创建类型B的对象
  • 在 A 的上下文中初始化对象(字段初始化器、构造函数体)
  • 在B的上下文中初始化对象(字段初始化器、构造函数体)

(随着构造函数链接 向上 继承树评估构造函数参数,当然......虽然构造函数也被称为向上链,作为第一个 任何构造函数的一部分都必须链接到同一个类或父类(super class),构造函数主体的主要部分自上而下发生)。

有关确切发生的更多详细信息,请参阅JLS 15.9.4JLS 12.5 .

关于java - 在 B 继承自 A 的情况下创建了多少个对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39444960/

相关文章:

java - URL url = getClass().getResource ("") 指的是哪个位置?

javascript - 奇怪的 javascript 行为 - 错误,除非以正确的顺序定义 'classes'

javascript - typeof 函数不是函数

java - 为什么动态调度的目标不是在编译时确定的?

recursion - 类型检查器断言在递归类型的类上失败

java - 使用 Spring Security 进行 Spring Boot 测试。如何启动另一种安全配置?

java - 无法将字符串转换为日期

java - 找不到 swagger-resources/configuration/ui 的映射

c# - 获取基本类型的所有最后后代?

c++ - 多态时识别对象的类型