当一个类扩展另一个类时,子类构造函数会调用超类构造函数。
在这个过程中,创建了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();
}
}
答案 0 :(得分:3)
在这个过程中创建了2个对象,子类和超级 类。
不,创建了一个对象:结构依赖于超类的子类的实例。
调用超类的构造函数是Java语言规范的要求。它允许保持一致性,因为子类应该依赖于它们的父类的构造规则。
答案 1 :(得分:2)
答案 2 :(得分:1)
仅创建一个对象。因此,将执行两个构造函数中的代码。子类有机会覆盖其父类的已定义行为。
一个例子会有所帮助。想象一下课程Human
和一个子课程Bob
:
class Human
class Bob extends Human
使用Bob bob = new Bob()
创建Bob时,您只会创建一个同样为human
的Bob实例。因此bob instanceOf Human
将是true
。
由于Bob
是human
,因此来自他和Human
构造函数的代码都已执行,并且他也从Human
获取所有方法。
通过使用super
,您不会引用父实例,而是引用在那里声明的代码。想象Human
方法isAlive
和Bob
重写此方法(他希望永远活着)。
但是,您希望能够显式调用isAlive
类中声明的Human
方法,但Bob
覆盖了它。您可以super.isAlive()
执行此操作。由于Java知道啊,他想要人类而不是Bob 的方法。
答案 3 :(得分:0)
在这个过程中,创建了2个对象,子类和超类。
不,只创建了一个对象 - 子类的对象。由于子类 - 超类关系被称为“is-a”,子类也是超类。
这就是为什么可以在子类上调用超类方法,只要这些方法是可见的。这也是超类的构造函数与子类的对象一起工作的原因。
答案 4 :(得分:0)
我认为只有一个对象,用它的构造函数和超构造函数构造。对象'ob'将继承B类和超类A的所有属性。例如,如果A的构造函数初始化变量,它们也将被初始化为对象'ob'。
答案 5 :(得分:0)
只有一个物体。调用super()来继承父级的行为。这就是为什么我们可以在子类中获得parent的属性。