在超类/子类框架中使用ArrayLists

时间:2012-04-11 05:39:35

标签: java inheritance arraylist

我有一个关于在简单的继承结构中使用数组结构(例如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?谢谢!

3 个答案:

答案 0 :(得分:3)

如果我正确理解了问题,那么最简单的解决方法就是不在sounds中声明另一个PirateParrot变量。相反,请确保soundsprotected已声明为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方法。