在Java中,您是否可以通过父类的子类的构造函数调用父类的超类构造函数?

时间:2014-04-01 23:14:38

标签: java inheritance constructor

我知道措辞有点令人困惑和奇怪,但是忍受我,我不知道如何短语,任何更短。

假设你有一个称为类SuperBlah,并且您继承了它在称为类Blah,那么您继承Blah到称为类ChildBlah(所以{{1 }})。如果SuperBlah-Blah-ChildBlah没有构造函数,super();的构造函数中使用的ChildBlah关键字是否会调用SuperBlah的构造函数?

对于那些拒绝的人,那么为什么这样做呢? 我们有一个名为BlusterBug的类,它扩展了Critter类,并在BlusterBug的构造函数中调用了super。 Critter没有构造函数,但是Critter扩展的Class确实有一个构造函数。 (我故意省略了类上的其余代码)

Blah

然后在Critter类中,它没有任何构造函数!

public class BlusterCritter extends Critter {
    // instance vaiables
    private int courageFactor;
    private static final double DARKENING_FACTOR = 0.05;
    // create a constructor(include what is necesary for parent)
    public BlusterCritter(int c)
    {
        super();
        courageFactor = c;
    }

但是Actor类有一个构造函数!

public class Critter extends Actor// omitted all the code
{
    /**
     * A critter acts by getting a list of other actors, processing that list,
     * getting locations to move to, selecting one of them, and moving to the
     * selected location.
     */
    public void act()
    {
        if (getGrid() == null)
            return;
        ArrayList<Actor> actors = getActors();
        processActors(actors);
        ArrayList<Location> moveLocs = getMoveLocations();
        Location loc = selectMoveLocation(moveLocs);
        makeMove(loc);
    }

最奇怪的部分?该程序工作得很好,编译器不会捕获任何错误!这是怎么回事?

5 个答案:

答案 0 :(得分:4)

如果Blah没有任何构造函数,编译器将为Blah生成仅super()的隐式无参数构造函数 - - 也就是说,它会调用SuperBlah的构造函数。

因此,当ChildBlah的构造函数调用super()时,它将调用编译器为Blah生成的隐式构造函数,从而生成SuperBlah&# 39;被调用的构造函数。所以在某种意义上,我认为你的问题的答案是&#34;是的&#34;。

但这仅在Blah没有构造函数时才有效。 (并且在您的实际代码中,Critter没有任何构造函数,因此它可以工作。)如果为Blah定义了任何其他构造函数,但是没有可访问的无参数构造函数,然后不会是一个隐式的无参构造函数,结果将是编译时的错误。

答案 1 :(得分:2)

不,它不会。它将在Blah中调用隐式默认构造函数 如果Blah定义了其他构造函数(带参数)但没有 默认构造函数,然后这将生成编译错误。

另外,请注意构造函数不是继承的 (如果这与您的问题/想法有任何关系)。

答案 2 :(得分:1)

是的,它会。如果Blah没有任何构造函数,它将调用默认的空构造函数,并且传递它将调用非参数SuperBlah构造函数。

答案 3 :(得分:0)

它将调用Blah的构造函数,如果Blah没有,则抛出编译器错误。

答案 4 :(得分:0)

没有。构造函数不喜欢层次结构中的中间类的可选覆盖方面的方法。如果超类的实例方法未在中间类中实现,则通过super.method()从子类调用该方法将调用超类方法。但是必须调用层次结构中每个类的构造函数 - 您不能跳过中间类的构造函数。