我知道措辞有点令人困惑和奇怪,但是忍受我,我不知道如何短语,任何更短。
假设你有一个称为类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);
}
最奇怪的部分?该程序工作得很好,编译器不会捕获任何错误!这是怎么回事?
答案 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()
从子类调用该方法将调用超类方法。但是必须调用层次结构中每个类的构造函数 - 您不能跳过中间类的构造函数。