当baseclass有一个带参数的构造函数时,为什么我不能创建一个无参数的子类构造函数?

时间:2014-03-27 10:59:52

标签: java inheritance constructor

我知道以下内容并不奏效,但您能帮我理解原因吗?

class A {
    A(int x) { 
       System.out.println("apel constructor A"); 
    } 
}

class B extends A {
    B() { 
       System.out.println("apel constructor B"); 
    } 
}

public class C {
    public static void main(String args[]) { 
       B b = new B(); 
    } 
}

9 个答案:

答案 0 :(得分:4)

您的类A使用显式参数构造函数,因此默认的no-args构造函数不会隐式存在。

要让您的班级B成功延长A,您需要:

  • A
  • 中声明的无参数显式构造函数
  • 或致电super(some int)作为B构造函数的第一行

考虑子类的构造函数隐式调用super()

答案 1 :(得分:4)

每个构造函数(Object除外)必须链接到另一个构造函数,这是它的第一件事。那是使用this(...)super(...)

如果没有指定任何内容,构造函数会隐式地将super()添加到超类中无参数构造函数的链中。迟早,您需要遍历继承层次结构的每个级别的构造函数。这确保了对象的状态基本上从每个角度都是有效的。

在你的情况下,你没有A中拥有无参数构造函数,因此B无法编译。要解决此问题,您需要向A添加无参数构造函数,或者明确链接到A中的参数化B构造函数:

public B() {
    super(0); // Or whatever value you want to provide
}

有关详细信息,请参阅JLS section 8.8.7

答案 2 :(得分:2)

您必须在子类Constructor中调用超类构造函数。

B是子类,它继承了超级A的行为。因此,当您创建B的实例时,B&#39的构造函数应该调用超类构造函数。

B() { 
   super(1); // or super()
   System.out.println("apel constructor B"); 
}

答案 3 :(得分:2)

这不起作用,因为如果类A没有声明默认构造函数,则必须显式调用超类A的一个构造函数。

答案 4 :(得分:2)

它没有编译,因为你还没有为A定义一个默认构造函数,B构造函数正在调用它。

答案 5 :(得分:2)

每次扩展一个类时,您调用的类的构造函数都将被调用(超级构造函数)。如果你声明一个构造函数,它将覆盖隐式构造函数,如果该构造函数有参数,那么扩展它的类将无法调用隐式构造函数,因此你必须显式调用构造函数。

示例:

  B() { 
    super(0);//integer value
    System.out.println("apel constructor B"); }     
}

答案 6 :(得分:2)

当您调用class' B的构造函数时,您应该声明您希望父类构造函数也被调用 e.g。

class B extends A{
  B(){
   super(0);
  }

  B(int i){
   super(i);
  }
}

这些构造函数中的任何一个都应该没问题

答案 7 :(得分:1)

每当在Java中调用子类的构造函数时,它首先会自动调用其超类的构造函数。始终首先执行Super类的构造函数,然后执行Sub类的构造函数。 在这种情况下,Super class Constructor在调用时需要一个整数参数,而代码不提供该参数。你可以试试这个:

class B extends A
{
  B()
  { 
     super(5);
     System.out.println("apel constructor B");
  }
}

答案 8 :(得分:1)

我用两种方式解决你的问题: -

  1. B类延伸A { B(int x){super(x); System.out.println(“hello second constructor”);} public static void main(String args []){B b = new B(10);}} 2。

    B级扩展A {     B(){super(任意int值);     System.out.println(“hello second constructor”);}     public static void main(String args []){B b = new B(10);}}