【问题标题】:How many objects were created where B is inherited from A?从 A 继承 B 的位置创建了多少对象?
【发布时间】:2016-09-12 07:05:35
【问题描述】:

这里有两个类,

class A
{
}
class B extends A
{
}

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

A a =  new B();

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

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

【问题讨论】:

  • 构造函数不创建对象。它是一种在 JVM 已经创建的对象上运行的方法。
  • 对于每个new,构造一个对象。
  • 是的,这是一个在你的对象上运行的简单方法。

标签: java inheritance polymorphism


【解决方案1】:

它创建一个对象,它是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 的上下文中初始化对象(字段初始化器、构造器主体)

(使用构造函数链接 up 继承树评估构造函数参数,当然......虽然构造函数也被称为沿链上升,作为 first 任何构造函数的一部分都必须链接到同一个类或超类,构造函数主体的主要部分是自上而下发生的。

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

【讨论】:

  • 能不能把构造函数看成一个普通的方法,只用来初始化字段,被对象调用?
  • @RubingYang:有点。除非你不能直接调用它,而且它有特殊的规则。 (当然,除了初始化字段之外,它还可以做其他事情 - 它通常不会。)
【解决方案2】:

一个对象被创建,它是一个B对象,它既有A定义的切面,也有B定义的切面。因为它包含了它们定义的所有方面,所以它是instanceof,既是A,又是B

...而A 继承自B

A 是由 B 继承的,而不是 它继承的。 (小词在非母语中是最难的。)B 继承 来自 A。一些常用术语:“B 派生自 A”、“B 派生自 A”、“AB 的超类”、“BA"。

在调用A的构造函数时是否创建了A的实例?

尽管有名字,构造函数并不创建对象;他们初始化他们;这个问题就是为什么:有时要正确初始化对象,您必须调用多个构造函数(对象继承层次结构中的每个级别一个)。在new B() 中,JVM 创建对象,然后调用B 并将this 设置为新的空白对象,以便B 可以初始化它。 B 做的第一件事是调用A 让它初始化对象的A 方面,然后B 初始化对象的B 方面。例如:

  1. JVM 创建对象。
  2. JVM 调用B
  3. B 致电A
  4. A 初始化它负责的对象的各个方面并返回
  5. B 初始化它负责的对象的各个方面并返回

【讨论】:

  • @RubingYang:这就是我所说的“小词在非母语中是最难的”的意思。 :-)
  • Despite their name, constructors don't create objects; they initialize them 这对我来说太棒了。谢谢!
【解决方案3】:

只创建了一个B 实例。

可以在链上调用构造函数,但每次调用仅作用于您正在创建的单个实例。

【讨论】:

    【解决方案4】:

    正如我上面已经说过的:只创建一个对象。为了澄清这一点,您可能会想到您刚刚写下的声明的三个部分: A a = new B()。这些是声明部分A a,实例化部分new和初始化部分B()

    如果您想阅读有关此主题的信息(因为您可能还没有弄清楚所有内容),请考虑访问https://docs.oracle.com/javase/tutorial/java/javaOO/objectcreation.html

    【讨论】:

      猜你喜欢
      • 2013-07-26
      • 2020-05-30
      • 1970-01-01
      • 1970-01-01
      • 2020-06-06
      • 2012-05-13
      • 2011-09-25
      • 1970-01-01
      • 2014-08-01
      相关资源
      最近更新 更多