Java中的隐式构造函数是什么?

9

在Java中是否必须调用基类构造函数?在C++中是可选的,所以我想问一下。

当我扩展ArrayAdapter时,我遇到了这个错误:"Implicit super constructor ArrayAdapter<String>() is undefined. Must explicitly invoke another constructor"

那么,调用基类构造函数的目的是什么?当创建对象时,首先调用基类构造函数,然后再调用派生类构造函数对吗?


您可能没有一个rrayAdapter<String>()构造函数。如果在基类中添加一个默认构造函数,应该就可以了。 - Chetter Hummin
所以,这是类似于C++中的DerivedClass(int x, int y): BaseClass(y)吗?对吧?还有一个疑问,在上述机制中,基类构造函数会调用两次还是一次? - Naruto
2个回答

11

如果您不自己调用无参构造函数,则会隐式调用它,但是如果该构造函数不存在,则无效。需要调用超类构造函数的原因是,超类通常有一些状态期望在构造后处于特定状态,这可能包括不能在子类中设置的私有变量。如果不调用构造函数,它将使对象处于可能无效的状态,这可能会导致各种问题。


所以,这是不是类似于C++中的DerivedClass(int x, int y): BaseClass(y)的写法?对吗?还有一个疑问,在上述机制中,基类的构造函数会被调用一次还是两次? - Naruto
是的,没错。Java只允许在构造函数中调用一个构造函数,可以是基类构造函数或者转发到当前类的另一个构造函数,因此基类构造函数只能被调用一次。 - ricochet1k

0

不必调用超类的无参构造函数。如果你想调用一个带参数的构造函数,使用super关键字,如下所示:

super(arg1, ...);

不需要调用超类的无参构造函数,但Java会自动插入调用吗? - Andrew McKinlay
@AndrewMcKinlay 是的,除非用户代码以 this(...) 开头。 - user207421

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接