需要代表动物可以吃什么食物作为一系列的字符串,而不是食物对象

时间:2015-12-08 21:57:12

标签: java string object inheritance

我希望我能清楚地解释清楚。我有一个有eats属性的动物(抽象类),这是一个代表每只动物可以吃的东西的字符串数组。这就是我的动物类看起来的样子。

public abstract class Animal {
    String[] eats;

    public Animal (String[] eats) {
        this.eats = eats;
    }
}

我还有一个狮子类,它扩展了我的动物类。规格告诉我,我的狮子会吃芹菜和牛排。我的Lion类中的构造函数如下(它有编译错误):

public Lion(String[] eats) {
    this.eats = steak, celery; 
}

我在食品类中创造了这两种食品,每种食品都有特定的健康价值和浪费。这是我的食品类:

public class Food {
    int healthGain;
    int wasteGain;
    public static void main(String[] args) {
        Food steak = new Food();
        steak.healthGain = +3;
        steak.wasteGain = 4;
        //same but for celery instead
    }
}    

我真的很困惑,因为我想要为每只动物吃的食物都有一系列字符串,但是我创造了食物对象而不是字符串(规范并没有要求我这样做,我只是看不到另一种做法它)。有一个更好的方法吗?或者我可以改变我的代码以使其编译?无论哪种方式,每只动物吃的食物必须是一系列的弦。提前谢谢。

3 个答案:

答案 0 :(得分:1)

你的狮子应该是这样的:

new String[]{...}

请注意,我们实际上并不需要构造函数中的任何参数,因为我们已经知道Lion吃了什么食物,并且每次创建Lion对象时要求用户提供此信息都是不好的。

BTW如果您想避免重复此Animal代码,请尝试将public Animal (String... eats) { // ^^^ this.eats = eats; } 构造函数更改为使用varargs

eats

这仍然允许您将String[]视为字符串数组(this.eats),以便您可以毫无问题地将其分配给public Lion() { super("steak", "celery"); } ,但现在Lion构造函数可能如下所示: / p>

localhost:3000/reset/65bb...

答案 1 :(得分:0)

以下是如何进行的简短示例:

public static void main(String args[]) {

    // Initialize this array with food types
    String[] foods = new String[] {"celery", "meat"}; 
    Lion lion = new Lion(foods); // Pass in the foods as an argument
}

public Lion(String[] eats) {
    super(eats); // Call the overloaded Animal constructor
}

答案 2 :(得分:0)

这是你应该做的:

class Lion extends Animal
{
    public Lion(String[] eats) {
        super(eats); //invoke superclass constructor
    }
}

由于eats不是私有的,因此它将被继承。还记得调用超类的构造函数,否则你会得到一个编译错误。

你不会对Lion在Lion类中吃什么进行硬编码。你在main()中做到了:

//In the main method
String[] eats = {"celery", "steak"};
new Lion(eats);