如果我有这个抽象类:
package com.abc;
public abstract class Player {
private String name;
public Player(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
当我从一个新的扩展一个新类时,新类默认使用继承的构造函数,还是必须创建一个调用“super”的构造函数?
答案 0 :(得分:5)
默认情况下,它将使用默认的空构造函数;因为你明确地提供了一个构造函数,所以你没有得到默认的构造函数。因此,是您必须明确调用super(String)
。如果您不想要这个限制,那么您应该为Player
添加一个空构造函数。
protected Player() { // <-- only visible to sub-classes.
// ... implicit super();
}
答案 1 :(得分:3)
默认情况下,如果您没有显式添加构造函数,Java编译器将在其中添加默认构造函数和super()
。由于您的Player
类具有参数化构造函数,因此您需要调用super
我必须创建一个调用“super”的构造函数吗?
是的,您需要显式添加默认构造函数。
public Player() {}
或者,
您可以在子类中添加带有参数的super()
。如下所示:
public ChildClass(String name) {
super(name);
}
如果你想要,你也可以重载构造函数。 read more about constructor overloading和约super()
。
答案 2 :(得分:2)
由于您的基类Player
缺少默认构造函数(如果您提供任何其他构造函数,则会自动删除自动生成的构造函数),派生类中的所有构造函数都需要调用明确的String
构造函数。
您可以使用super
并为name
传递适当的值。这必须是任何子类构造函数中的第一个语句。