本论坛全新,以及Java编程。 我已经看到了关于这个问题的其他线索,但是它没有帮助我,也许它应该是因为我迄今为止糟糕的编程词汇而错过了它。 Anywasy-问题;
{
:a => 1,
:aaa => 2
:b => 3
}
错误代码:隐式超级构造函数Animal()未定义。必须显式调用另一个构造函数
答案 0 :(得分:0)
问题在于Cat
中的构造函数默认尝试调用Animal
的默认构造函数,通过在Animal
中删除已删除的构造函数。扩展其他类的类的构造函数将自动调用其超类的默认构造函数,即使您没有明确地将其写入。
所以你的代码看起来应该是这样的
public class Animal {
public Animal(String string){
}
//other code in the class
}
public class Cat{
public Cat(String name){
super(name);
}
//other code in the class
}
此处的super(name)
调用会调用我们为Animal
定义的构造函数,因为super
引用的类比Cat
扩展而来。
答案 1 :(得分:0)
因此,您定义了Cat继承Animal的类层次结构。 Java创建Cat时的作用是创建Cat的新实例。 Java实际上做的是:
要修复它,您可以提供无参数构造函数
public class Animal {
private String name;
public Animal(){
}
public void setName(String name) {
this.name = name;
}
}
public class Cat extends Animal {
public Cat(String name) {
super();
setName(name);
}
}
或者您可以调用Animal构造函数并直接向其传递名称
public class Animal {
private String name;
public Animal(String name){
this.name = name;
}
}
public class Cat extends Animal {
public Cat(String name) {
super(name);
}
}
答案 2 :(得分:0)
这是错误是由子类的构造函数隐式调用基类的默认构造函数引起的
您的代码实际上是这样做的:
public class Cat{
public Cat(String name){
super();
setName(name);
}
//other code in the class
}
因为您已在基类Animal
中定义了构造函数,所以默认构造函数不再存在。所以你需要做两件事之一:
添加一个什么都不做的默认构造函数(或者确实帮助你构建对象而不需要传入任何参数
public class Animal {
String name;
public Animal(){
}
public Animal(String string) {
}
/// other code
}
或者调用您创建的基类构造函数并修改子类构造函数,以执行该子类所需的额外操作。
public class Animal {
private String name;
public Animal(String name){
this.name = name;
}
///other code
}
public class Cat extends Animal {
public Cat(String name) {
super(name);
}
/// other code
}
在创建子类时,您应该考虑的是继承的有用性。拥有一个可以执行常规操作和设置的基类使得子类只应该执行它们唯一的操作。
如果将基类用作标签而不是共享功能,那么最好将基类作为接口。在构造函数中,您应该在基类构造函数中完成任何常规设置,然后设置子类构造函数中子类唯一的字段。
public class Animal {
private String name;
private int legs;
public Animal(String name, int num_of_legs){
this.name = name;
this.legs = num_of_legs;
}
protected int getAnimalLegs(){
return this.legs;
}
/// other code, getters, setters, etc.
}
public class Cat extends Animal {
private int cuteness;
public Cat(String name, int num_of_legs, int level_of_cuteness) {
super(name, num_of_legs);
this.cuteness = level_of_cuteness;
}
/// other code
}
这将在超级类Cat上设置私有变量名称和腿,并使Cat的构造函数仅执行与其字段相关的操作,即设置Cat对象的可爱度。另请注意,在子类构造函数中调用超级构造函数之前,无法调用代码。如果这样做,最终会出现另一个错误。