Java 创建子类时是否需要super?
在此程序中,无需使用Java 创建子类时是否需要super?,java,constructor,arguments,super,Java,Constructor,Arguments,Super,在此程序中,无需使用super到达超类的构造函数: class Base{ Base(){ System.out.println("Base"); } } public class test2 extends Base{ test2() { //super(); System.out.print("test2"); } public static void main(String argv[])
super
到达超类的构造函数:
class Base{
Base(){
System.out.println("Base");
}
}
public class test2 extends Base{
test2() {
//super();
System.out.print("test2");
}
public static void main(String argv[]){
test2 c = new test2();
}
}
但是这个程序需要super
,并且在quest1
构造函数中给出了一个错误
构造函数quest
无法应用于给定类型:必需的int,未找到任何参数
当且仅当父类
没有默认构造函数(不接受任何参数)时,才需要调用super()
在所有其他情况下(存在零参数的构造函数),您不必对其进行编码。它被隐式地称为
这些规则适用于:
- 如果父类根本没有构造函数,则它有默认构造函数,它不接受参数->不需要
super()
李>
- 父类声明了一个没有参数的构造函数->不需要
super()
- 您的类有一个带参数的构造函数,但没有一个不带参数的构造函数->您需要通过
super()
JLS 8.8.7。构造体
如果构造函数体不是以显式构造函数调用开头,并且所声明的构造函数不是原始类对象的一部分,则构造函数体隐式地以超类构造函数调用“super();
”开头,对其直接超类的构造函数的调用,不带任何参数
在
注释掉的行是自动添加的,因为超类的无参数构造函数已经定义,所以没有错误
就
class Quest {
Quest(int y) {
System.out.print("A:"+y);
}
}
class Quest1 extends Quest {
Quest1(int x) {
//super(x+1);
System.out.print("B:"+x);
}
}
隐式调用super()
试图调用超类中未定义的构造函数,这会导致错误
隐式超级构造函数Quest()未定义。必须显式调用另一个构造函数
取消显式构造函数调用的注释将替换隐式调用,从而解决问题。或者,在超类中定义无参数构造函数。如果在超类中创建构造函数,则应调用超类构造函数(例如:super()在子类构造函数得到调用之前。您的问题得到回答了吗?@user1803551我知道什么时候需要super,但当我们需要super时,答案令人困惑。所以我没有选择答案。这很公平,但是你应该要求回答者澄清,这就是评论的目的,他们的工作就是解释答案并补充答案。我把答案编辑到我的文章的结尾怎么样?当我们使用带参数的方法时,我们使用super,对吗?如果没有像我的第一个例子那样的论点,我们就不使用super。但是如果有像我的2这样的论点。例如,我们使用论点,对吗?不要在你的问题中包含其他人的答案。您可以编辑问题以使其更清楚或添加信息。关于super(…)
的用法,您可以在方法中使用它来调用重写的方法,而不考虑参数。是否有参数不影响super
。您的问题是关于构造函数的,其中的规则与其他“常规”方法不同,但我所说的仍然有效。在调用子类构造函数之前,您不能调用超级构造函数。这必须是你在子类构造函数中做的第一件事。是的,我也一样。请理解我的回答。你所理解的:超级();子类obj=新的子类();每个人都知道这是工作。我的答案是:SubClass{super();SubClass(){}为什么不在你的答案中写清楚呢?正如现在所写,这是错误的。我刚才所说的。这不是“你应该在子类构造函数被调用之前调用超类构造函数”,而是你应该在子类构造函数调用中首先调用超类构造函数。即使这样,也应该是can,因为只有当super
构造函数有参数时,这才是真的。
class Base {
Base() {
}
}
public class test2 extends Base {
test2() {
//super();
System.out.print("test2");
}
}
class Quest {
Quest(int y) {
System.out.print("A:"+y);
}
}
class Quest1 extends Quest {
Quest1(int x) {
//super(x+1);
System.out.print("B:"+x);
}
}