Java子类使用报错:隐式超类构造方法Animal()未定义
搞定Java里的"隐式超类构造方法未定义"错误
嘿,兄弟,刚上手Java就碰到这种构造函数的坑太正常了,我来给你掰扯清楚咋回事儿!
你遇到的这个错误Implicit super constructor Animal() is undefined. Must explicitly invoke another constructor,根源其实是Java的构造函数调用规则:子类的构造函数默认会偷偷调用父类的无参构造方法,但你的父类Animal自己定义了一个带String参数的构造函数,这时候Java就不会自动给Animal生成无参构造了,子类Cat找不到这个无参构造,自然就报错啦。
给你两种解决办法,选哪种看你需求:
方案一:显式调用父类的带参构造(更推荐)
直接在Cat的构造函数里用super()调用父类的带参构造,把name传进去,这样还能省掉setName的调用,更符合面向对象的初始化逻辑:
package animals; public class Cat extends Animal { public Cat (String name) { super(name); // 显式调用父类的带参构造,把name传给父类 } public void introduceYourself(){ System.out.println("Mjau. I'm a cat called " + getName()); } }
顺便提一句,你的Animal构造函数里其实没做赋值,记得把它改成这样才有用:
public Animal(String string) { this.name = string; // 把参数赋值给name属性 }
不然父类的name还是null哦!
方案二:给父类添加无参构造
如果你就想保留Cat里的setName调用,那给Animal加个无参构造就行,编译器就不会报错了:
package animals; public class Animal { String name; // 添加无参构造 public Animal() {} public Animal(String string) { this.name = string; } // 其他方法不变... }
不过这种方式不如第一种优雅,因为对象初始化的时候最好在构造函数里完成属性赋值,而不是事后调用set方法。
总的来说,方案一是更规范的做法,既能解决错误,又能让代码更符合Java的面向对象设计~
内容的提问来源于stack exchange,提问作者zkalman
相关产品推荐
相关产品推荐

