层次结构中未定义的构造函数

时间:2017-02-06 03:16:54

标签: java inheritance constructor hierarchy superclass

我正在制作一个超级食物,有两个子类:晚餐和早餐。晚餐和早餐将各自有两个子类,晚餐将有海鲜和ChickenDish,而早餐将有谷物和煎蛋。现在我只编写了Food and Dinner,但是当我尝试在main编程时,它说我的构造函数是未定义的。

这是我的食物超类:

public class Food {
private double price;
private int calories;
private boolean vegan;

public Food(double price, int calories, boolean vegan){
    this.price = price;
    this.calories = calories;
    this.vegan = vegan;
}

public double getPrice(){
    return price;
}

public int getCalories(){
    return calories;
}

public boolean getVegan(){
    return vegan;
}

}

这是我的晚餐子类:

public class Dinner extends Food{

public Dinner(double price, int calories, boolean vegan){
    super (price, calories, vegan);
}

}

为了保持这个问题的开放性,我只是在寻找一个更概念性的答案,以便它可以适用于其他人的问题。如何为超级/子类创建构造函数以及如何在main中使用它?谢谢大家。

P.S。:我知道我可以删除“公共食品”构造函数并写上“食品x =新食品”;在主要但我的comp sci老师要求你在每个类中都有一个构造函数:super或sub。

编辑:我目前的主要方法是:

public class Main {
public static void main(String[] args){
    Food x = new Food();

}

}

我得到“构造函数Food()未定义”。我知道我可能错过了某些错误/做错了所以我只是在寻找如何实际完成这项任务的指导。

1 个答案:

答案 0 :(得分:0)

constructors有多种类型。

一种类型是default constructor

public Food(){

}

只要创建了类的对象,就会调用它。在这种情况下,如果您创建Food类的对象,则将从main调用此构造函数,如

Food obj = new Food();

您在Food课程中定义的内容称为parameterized constructor

public Food(double price, int calories, boolean vegan){
    this.price = price;
    this.calories = calories;
    this.vegan = vegan;
}

当您创建Food类的对象(如

)时,将调用此构造函数
Food obj = new Food(20.22, 10, true);

您需要将值作为参数传递,以便调用此构造函数。

注意将调用哪个构造函数取决于您是否在构造函数调用中传递参数值。

您在main方法

中收到错误消息
public class Main {
public static void main(String[] args){
    Food x = new Food();
}

您正在调用Food类的默认构造函数,但在Food类中,您已定义了parameterized constructor,其中需要3个参数。

创建类Food的对象时需要传递这些参数 例如

Food obj = new Food(20.22, 10, true);