为什么不能这样做?

时间:2014-06-17 10:21:54

标签: java

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

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

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

它说A类的构造函数不适用于给定的类型。

4 个答案:

答案 0 :(得分:10)

您必须在构造函数A(int x)中显式调用构造函数B()。即,你必须写

class B extends A {
   B() {
       super(<<< insert some int here>>>);
       System.out.println(" constructor B");
   } 
}

如果你没有添加这样的超级调用,那么java将为你插入super();,它会尝试调用A()。由于没有构造函数A(),您会收到错误,指出您的构造函数不能应用于参数类型。

答案 1 :(得分:1)

如果你写一个parameterized的,那么在类中有一个默认的构造函数总是很好的。

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

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

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

答案 2 :(得分:0)

如果我们没有为类A指定构造函数,那么没有args的默认构造函数将与该类关联,如果为类A指定一个/多个构造函数,则必须使用其中一个每次你想从这个类创建一个对象。当一个类B扩展一个类A时,如果你没有指定一个构造函数,那么构造函数必须通过super()调用父类(A)的一个构造函数。到A然后它实现上被称为B的构造函数,如果你明确定义了A的构造函数,那么当你创建B的构造函数时你必须调用它:

B() {  super(0)/*this call should be if the first line, you have to pass your default args if the constructor have args*/;
       System.out.println(" constructor B"); 
    } 

答案 3 :(得分:0)

您看到的是constructor chainingread

来自链接的

摘录。

If a constructor does not explicitly invoke a superclass constructor, the Java compiler
automatically inserts a call to the no-argument constructor of the superclass. If the super
class does not have a no-argument constructor, you will get a compile-time error. Object 
does have such a constructor, so if Object is the only superclass, there is no problem.