尝试使用子类时的错误代码//完全不熟悉Java

时间:2018-01-19 14:59:20

标签: java

本论坛全新,以及Java编程。 我已经看到了关于这个问题的其他线索,但是它没有帮助我,也许它应该是因为我迄今为止糟糕的编程词汇而错过了它。 Anywasy-问题;

{
  :a   => 1,
  :aaa => 2
  :b   => 3
}

错误代码:隐式超级构造函数Animal()未定义。必须显式调用另一个构造函数

3 个答案:

答案 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实际上做的是:

  1. 它调用Cat构造函数(您提供的)
  2. 因为Cat继承自Animal,所以也想调用Animal构造函数。默认情况下,它调用无参数构造函数。但是,您只为Animal提供了一个接受String的构造函数。这就是它抱怨的原因。
  3. 要修复它,您可以提供无参数构造函数

    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对象的可爱度。另请注意,在子类构造函数中调用超级构造函数之前,无法调用代码。如果这样做,最终会出现另一个错误。