我有一个关于在简单的继承结构中使用数组结构(例如ArrayLists)的问题。我正在努力写下它:希望你能理解我想要问的内容。
我有一个超类Parrot
和一个扩展PirateParrot
的子类Parrot
。在Parrot
中,我有以下方法:
public String speak() {
int rand = (int)(Math.random() * sounds.size());
return sounds.get(rand);
}
返回名为sounds
的ArrayList中的随机字符串,该字符串在Parrot
类中创建。
如果我创建一个名为PirateParrot
的{{1}}的单独实例,它也有自己的ArrayList,并尝试调用polly
,而polly.speak();
没有任何隐式实现{{{ 1}}类,我被抛出一个“线程中的异常”main“java.lang.IndexOutOfBoundsException:Index:0,Size:0”
如果我专门将PirateParrot
中的speak()方法复制/粘贴到Parrot
中,则代码编译正常并正常运行。之前到底出了什么问题?有没有办法让这个运行正确而无需将speak()方法复制/粘贴到PirateParrot
?谢谢!
答案 0 :(得分:3)
如果我正确理解了问题,那么最简单的解决方法就是不在sounds
中声明另一个PirateParrot
变量。相反,请确保sounds
中protected
已声明为Parrot
,然后在PirateParrot
构造函数中填充继承的sounds
变量,其中包含您想要的任何声音{ {1}}要有。
另一种方法可能是使用PirateParrot
方法返回列表并从getSounds()
内部调用getSounds()
,而不是直接引用speak()
。然后,sounds
只需覆盖PirateParrot
即可返回getSounds()
的版本。
答案 1 :(得分:1)
public class Parrot {
private final ArrayList<String> sounds;
private static ArrayList<String> REGULAR_PARROT_SOUNDS = new ArrayList<String>();
static {
REGULAR_PARROT_SOUNDS.add(...);
...
}
protected Parrot(ArrayList<String> sounds) {
this.sounds = sounds;
}
public Parrot() {
this(REGULAR_PARROT_SOUNDS);
}
}
public class PirateParrot {
private static ArrayList<String> PIRATE_PARROT_SOUNDS = ...;
public PirateParrot() {
super(PIRATE_PARROT_SOUNDS);
}
}
答案 2 :(得分:1)
在调用之前,您没有初始化并填充sounds
,请执行以下操作:
在sounds
的{{1}}中初始化并填充constructor
,然后调用超类'PirateParrot
方法。