Java-创建子类对象后超类对象的位置

时间:2017-06-27 11:09:28

标签: java

当一个类扩展另一个类时,子类构造函数会调用超类构造函数。

在这个过程中,创建了2个对象,子类和超类。我的问题是这个超类对象在子类对象的生命周期中发生了什么?

它是否会被垃圾收集,因为引用属于子类?

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

class B extends A
{
    public B()
    {
        //  super();  default added 
        System.out.println("sub class constructor");
    }
}

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

6 个答案:

答案 0 :(得分:3)

  

在这个过程中创建了2个对象,子类和超级   类。

不,创建了一个对象:结构依赖于超类的子类的实例。

调用超类的构造函数是Java语言规范的要求。它允许保持一致性,因为子类应该依赖于它们的父类的构造规则。

答案 1 :(得分:2)

错误的假设。

完全创建一个对象。是的,将发生多个构造函数调用(有关具体情况的详细信息,请参阅here。)

但是从一开始;直到最后,new返回新创建的对象:只有一个对象出现!

答案 2 :(得分:1)

仅创建一个对象。因此,将执行两个构造函数中的代码。子类有机会覆盖其父类的已定义行为。

一个例子会有所帮助。想象一下课程Human和一个子课程Bob

class Human
class Bob extends Human

使用Bob bob = new Bob()创建Bob时,您只会创建一个同样为human的Bob实例。因此bob instanceOf Human将是true。 由于Bobhuman,因此来自他和Human构造函数的代码都已执行,并且他也从Human获取所有方法。

通过使用super,您不会引用父实例,而是引用在那里声明的代码。想象Human方法isAliveBob重写此方法(他希望永远活着)。 但是,您希望能够显式调用isAlive类中声明的Human方法,但Bob覆盖了它。您可以super.isAlive()执行此操作。由于Java知道啊,他想要人类而不是Bob 的方法。

答案 3 :(得分:0)

  

在这个过程中,创建了2个对象,子类和超类。

不,只创建了一个对象 - 子类的对象。由于子类 - 超类关系被称为“is-a”,子类也是超类

这就是为什么可以在子类上调用超类方法,只要这些方法是可见的。这也是超类的构造函数与子类的对象一起工作的原因。

答案 4 :(得分:0)

我认为只有一个对象,用它的构造函数和超构造函数构造。对象'ob'将继承B类和超类A的所有属性。例如,如果A的构造函数初始化变量,它们也将被初始化为对象'ob'。

答案 5 :(得分:0)

只有一个物体。调用super()来继承父级的行为。这就是为什么我们可以在子类中获得parent的属性。