我希望我能清楚地解释清楚。我有一个有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
}
}
我真的很困惑,因为我想要为每只动物吃的食物都有一系列字符串,但是我创造了食物对象而不是字符串(规范并没有要求我这样做,我只是看不到另一种做法它)。有一个更好的方法吗?或者我可以改变我的代码以使其编译?无论哪种方式,每只动物吃的食物必须是一系列的弦。提前谢谢。
答案 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);