Super()关键字... 它能用于调用多个超类的构造函数吗?

9 浏览
0 Comments

Super()关键字... 它能用于调用多个超类的构造函数吗?

我感觉有些地方我没有理解到位,或者说有些东西对我来说不太顺畅。我正在读一本关于Java的书,刚刚学到了关于super()的用法。当用于获取构造函数时,它会获取上一级超类的构造函数,对吗?那如果我想获取两级上的超类构造函数,应该怎么做?

我脑子里总感觉有些不对劲,希望这个问题能帮助我理清思路。

0
0 Comments

在Java中,当创建一个对象时,构造函数会被调用来初始化对象的状态。在构造函数中,可以使用关键字super来调用其父类的构造函数,以确保对象在被初始化时,其父类的构造函数也得到了调用。然而,关键字super只能用于调用直接父类的构造函数,无法直接调用多级父类的构造函数。

这个问题的出现是因为在Java中,每个构造函数(除了在Object类中的根构造函数)都会调用一个super构造函数。如果在构造函数中没有显式地指定super调用,或者在构造函数的第一条语句是一个对该类中的另一个构造函数的this调用,那么编译器会在每个构造函数的第一条语句中插入一个super调用。

但是,除非使用this()来调用构造函数,否则编译器会自动插入super()调用。也就是说,如果在构造函数中使用了this()来调用另一个构造函数,那么编译器就不会插入super()调用。

解决这个问题的方法是,在需要调用多级父类的构造函数时,可以通过在每个父类的构造函数中使用super关键字来实现。也就是说,每个父类的构造函数中都需要调用其直接父类的构造函数,以此类推,直到达到根父类的构造函数为止。

总结起来,关键字super只能用于调用直接父类的构造函数,无法直接调用多级父类的构造函数。如果需要调用多级父类的构造函数,可以通过在每个父类的构造函数中使用super关键字来实现。这样可以确保对象在被初始化时,其所有父类的构造函数都得到了调用。

0
0 Comments

Super()关键字只能调用其直接上一级的构造函数,因为一个类只能继承一个类,其父类也只能继承一个类,并且它将调用其父类的构造函数。

在上述代码中,GrandParent类是最顶层的父类,它没有继承任何类,因此它的构造函数没有调用任何super()关键字。

Parent类继承自GrandParent类,它的构造函数中调用了super()关键字,用于调用GrandParent类的构造函数。

Child类继承自Parent类,它的构造函数中也调用了super()关键字,用于调用Parent类的构造函数。

因此,构造函数的调用顺序是Child -> Parent -> GrandParent。

如果需要调用更远的超类的构造函数,可以使用多个super()关键字来实现。例如,如果Child类继承自Parent类,而Parent类继承自GrandParent类,可以使用以下代码:

class GrandParent
{
      GrandParent()
      {
      }
 }
class Parent extends GrandParent
{
     Parent() {
          super(); //calls GrandParent()
     }
}
class Child extends Parent
{
      Child() {
           super(); //calls Parent()
           super(); //calls GrandParent()
     }
}

这样,Child类的构造函数将依次调用Parent类和GrandParent类的构造函数。

0