当超类只有一个带参数的构造函数时,所有带有参数的子类的构造函数都需要super(args)吗?

时间:2016-12-21 04:46:26

标签: java

class Animal{
    String s;
    Animal(String s){
        this.s = s;     
    }   
}


class Dog extends Animal{
    Animal animal;
    Dog(String s) {
        super(s);       
    }
    //here is an error "Implicit super constructor Animal() is undefined.Must explicitly invoke another constructor"
    Dog(Animal animal){
        this.animal = animal;       
    }   
}

我的困惑是,我已经在

中调用了超类的构造函数with-parameters
Dog(String s) {
    super(s);       
}

但为什么我仍然在另一个构造函数Dog(Animal animal)中收到错误消息?

构造函数机制在此示例中的工作原理是什么?

谢谢!

2 个答案:

答案 0 :(得分:5)

你问题的答案很简单:是的。

任何子类构造函数必须首先调用super。如果超类只有一个ctor采用一些参数,那么子类中的那些“超级调用”必须使用该ctor。

答案 1 :(得分:4)

您的代码不正确。当Dog延伸Animal时,Dog不需要(也不应该)Animal对象

正确的方法是

class Animal{
    String s;
    Animal(String s){
        this.s = s;     
    }  

    // add a setter and getter
    public String getS () {return s;}
    public void setS (String s) {this.s = s;} 
}


class Dog extends Animal{
    Dog(String s) {
        super(s);       
    }
}