Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 创建子类时是否需要super?_Java_Constructor_Arguments_Super - Fatal编程技术网

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);
    }
}