你的代码对我来说完全没有意义。我想我明白你想要什么。首先让我们看看你的代码。
你有一个很好的Goose
实现类Animal
。然后你有一个link
在类中调用的列表:
public class Goose implements Animal{
List<Animal> link = new ArrayList<Animal>(); //remember ().
...
您班级的每个实例Goose
都会有一个动物列表。这看起来很奇怪。不过,从这个问题来看,听起来您想要 1 个包含动物的列表,而不是每个列表中的列表Goose
。
然后你有两个构造函数:
Goose(Duck d){
link.add(d);
}
Goose(Goose g){
link.add(g);
}
您需要将 aDuck
或 aGoose
作为输入添加到 new 的内部列表中Goose
。这意味着每个新实例都将从其列表中的 aDuck
或 a开始。Goose
似乎您希望您的构造函数成为add
方法。
最后你有这些:
Goose g3 = new Goose(new Duck()); //You were missing () here also
Goose g2 = new Goose(g2); //Syntax error. Should probably be ".. new Goose(g3);"
我不完全确定为什么您的Goose
班级中有这些,而且它们看起来应该在其他地方声明。因为现在每个都Goose
包含另外两只被称为鹅的鹅g3
,g2
这也没有多大意义(除非它们被用作鹅的父母的参考,但似乎并非如此)。
我认为您想要什么以及如何实现它:您需要修改您的Goose
类,以便每只鹅只有与每只鹅相关的成员。它可能看起来像这样(假设动物接口声明了一个eat()
方法):
public class Goose implements Animal {
@Override
public void eat() {
// Om nom nom
}
}
然后你可以移动link
,g2
到g3
方法main
:
public static void main(String[] args) {
List<Animal> link = new ArrayList<Animal>();
Goose g2 = new Goose();
Goose g3 = new Goose();
link.add(g2);
link.add(g3);
..
这样做你只能link
在方法中使用列表main
。您还可以使其成为包含的类的属性main
以扩大范围。如果您需要全局访问,您可以创建一个包含它的单例public static
类(或在某个地方创建,但我会推荐另一种方法)。
如果类正确实现了接口,您还可以将 a 添加Duck
到列表中:Duck
Animal
link.add(new Duck());
如果Animal
接口声明了一个名为的公共方法,eat
您现在可以遍历列表并让所有动物吃掉:
for(Animal a : link) {
a.eat();
}
如果我错过了什么,请随时发表评论。