我有一个关于在简单继承结构中使用数据结构(例如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版本。

10-07 15:21