在创建子类时我是否需要super?

时间:2015-12-19 13:59:54

标签: 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[]){

        test2 c = new test2();
    }    
}

但是这个程序需要super并在quest1构造函数中说错误

  

构造函数quest无法应用于给定类型:required int,found no parameters

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

class Test {

    public static void main(String argv[]){

        Quest1 q = new Quest1(5); 
    }
}

3 个答案:

答案 0 :(得分:1)

当且仅当您的父super()没有默认构造函数(接受无参数)时,才需要调用class

在所有其他情况下(存在零参数的构造函数),您不必编写代码。无论如何,这是隐含的。

这些规则适用:

  • 如果您的父类根本没有构造函数,则它具有默认构造函数,该构造函数不带参数 - >不需要super();
  • 您的父类声明一个没有参数的构造函数 - >无需super()
  • 你的班级有一个带参数的构造函数,但没有构造函数没有参数 - > 需要通过super()
  • 调用带有数学参数的已定义构造函数之一

答案 1 :(得分:1)

  

JLS 8.8.7。构造函数主体

     
    

如果构造函数体不是以显式构造函数调用开始,并且声明的构造函数不是原始类Object的一部分,那么构造函数体隐式地以超类构造函数调用“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);
    }
}

隐式调用super()试图在超类中调用未定义的构造函数,这会导致错误

  

隐式超级构造函数Quest()未定义。必须显式调用另一个构造函数。

取消注释显式构造函数调用会替换隐式调用,从而解决问题。或者,在超类中定义无参数构造函数。

答案 2 :(得分:-1)

如果在超类中创建构造函数,则应在子类构造函数调用之前调用超类构造函数(Ex:super())。