1

我有一个关于在简单继承结构中使用 ArrayLists 等数据结构的问题。我很难措辞:希望你能理解我想问的问题。

我有一个超类Parrot和一个PirateParrot扩展的子类Parrot。在Parrot中,我有以下方法:

 public String speak() {
     int rand = (int)(Math.random() * sounds.size());
     return sounds.get(rand);
    }

它在类sounds中创建的 ArrayList 中返回一个随机字符串。Parrot

如果我创建一个PirateParrot被调用的单独实例polly,它也有自己的 ArrayList,并尝试在polly.speak();没有任何隐式实现的情况下调用类中的 speak 方法,我会在线程“main”java.lang.IndexOutOfBoundsException: Index 中PirateParrot抛出一个“异常” :0,尺寸:0"

Parrot如果我专门从into复制/粘贴 speak() 方法PirateParrot,则代码可以正常编译并正常运行。之前的问题到底是什么?有没有办法让它正确运行,而不必将 speak() 方法复制/粘贴到 中PirateParrot?谢谢!

4

3 回答 3

3

如果我正确理解了这个问题,那么最简单的解决方法是不在sounds. PirateParrot相反,请确保在sounds中声明,然后在构造函数中使用您想要的任何声音填充继承的变量。protectedParrotPirateParrotsoundsPirateParrot

另一种选择可能是有一个getSounds()方法来返回列表并getSounds()从内部调用speak()而不是sounds直接引用。然后PirateParrot只需要覆盖getSounds()以返回其版本sounds

于 2012-04-11T05:45:16.717 回答
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);
  }
}
于 2012-04-11T05:52:24.720 回答
1

在调用它之前,您没有初始化和填充sounds它,请执行以下操作:在of中
初始化和填充,然后调用superclass '方法。soundsconstructorPirateParrotspeak

于 2012-04-11T05:52:28.133 回答