我有一个关于在简单继承结构中使用数据结构(例如ArrayLists)的问题。我现在很难说这句话:希望您能理解我要问的问题。
我有一个超类Parrot
和一个子类PirateParrot
扩展了Parrot
。在Parrot
中,我有以下方法:
public String speak() {
int rand = (int)(Math.random() * sounds.size());
return sounds.get(rand);
}
它在
sounds
类中创建的名为Parrot
的ArrayList中返回随机字符串。如果我创建一个名为
PirateParrot
的单独的polly
实例,该实例也具有自己的ArrayList,并尝试在polly.speak();
类中对peak方法没有任何隐式实现的情况下调用PirateParrot
,则会引发“异常在线程“主”中java.lang.IndexOutOfBoundsException:索引:0,大小:0“如果我专门将talk()方法中的
Parrot
复制/粘贴从PirateParrot
复制到PirateParrot
,则代码可以正常运行。以前到底是什么问题?有没有一种方法可以使此方法正确运行,而不必将speak()方法复制/粘贴到中?谢谢! 最佳答案
如果我正确理解了该问题,那么最简单的解决方法是不在sounds
中声明另一个PirateParrot
变量。相反,请确保在sounds
中将protected
声明为Parrot
,然后在PirateParrot
构造函数中,仅使用您希望sounds
具有的声音填充继承的PirateParrot
变量。
另一种选择是使用getSounds()
方法返回列表并从getSounds()
内部调用speak()
而不是直接引用sounds
。然后,PirateParrot
仅需覆盖getSounds()
即可返回其sounds
版本。