2015-12-19 22 views
1

在这个程序就没有必要了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(); 
    }  
} 

但这个方案在quest1构造函数需要super并给出了一个错误说

构造quest不能适用于给定类型:必填int,找不到参数

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

你的问题是回答? – user1803551

+0

@ user1803551我明白当我需要超级但是当我们需要超级时,答案令人困惑。所以我没有选择一个。 – madkobra

+0

够公平的,但你应该要求回答者澄清,这就是评论的意思,他们的工作是解释答案并对其进行补充。 – user1803551

回答

1

JLS 8.8.7定义与mathching参数的构造。构造函数体

如果构造体不明确的构造函数调用,并正在申报的构造开始不是原始类Object的一部分,那么在构造函数体含蓄与超类构造函数调用“​​”开始,一调用它的直接超类的构造函数,它不带任何参数。

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()的情况下,试图调用一个未定义的构造在超类中,这会导致错误

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

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

1

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

在所有其他情况下(其中存在一个具有零参数的构造函数),您不必编写代码。无论如何它都被隐式地称为。

本规则适用于:

  • 如果你的父类具有在所有没有构造,它具有默认的构造函数,它没有参数 - >不需要super();
  • 你的父类声明无参数的构造函数 - >不需要super()
  • 类与参数的构造函数,但没有构造不带参数 - >您需要调用的一个经由super()
-1

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

+0

在调用子类构造函数之前,不能调用超级构造函数。它必须是你在子类构造函数中做的第一件事。 – user1803551

+0

是的,我也是电话相同。请理解我的答案。你懂的:super(); SubClass obj = new SubClass();每个人都知道这是“伤疤”。我的答案是:SubClass {super(); SubClass(){}} – Doss

+0

为什么你不在回答中写清楚?正如现在所写,这是错误的。 – user1803551

相关问题