在从A继承B的地方创建了多少个对象?

时间:2016-09-12 07:05:35

标签: 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();

4 个答案:

答案 0 :(得分:3)

创建了一个对象,该对象是B对象,其中包含A定义的方面和B定义的方面。由于它包含了两者所定义的所有方面,因此它instanceof AB

  

... A继承自B

AB继承,而不是来自 。 (这些小词在非母语中是最难的。)B A继承。关于此问题的一些常用术语:" B源自A"," B源自A",& #34; AB"的超类," BA"的子类。

  

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

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

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

答案 1 :(得分:3)

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

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 继承树评估构造函数参数,当然......虽然构造函数也被称为上行链接,因为第一个任何构造函数的一部分必须链接到同一个类或超类,构造函数体的主要部分自上而下发生。)

有关完全的详细信息,请参阅JLS 15.9.4JLS 12.5

答案 2 :(得分:1)

只创建了B的一个实例。

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

答案 3 :(得分:0)

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

如果您想阅读这个主题(因为可能并非一切都清楚了),请考虑访问https://docs.oracle.com/javase/tutorial/java/javaOO/objectcreation.html