在Java中调用子类方法

时间:2010-03-26 09:18:42

标签: java inheritance polymorphism

鉴于以下情况(下面的UML),

如果Y有方法:

public void PrintWs();

和X有:

ArrayList <P> myPs = new ArrayList();

Y y = new Y();
Z z = new Z();
myPs.add(y);
myPs.add(z);

如何遍历每个myPs对象并调用所有Ys PrintWs(不使用instanceof)?

http://starbucks.mirror.waffleimages.com/files/68/68c26b815e913acd00307bf27bde534c0f1f8bfb.jpg

对不起,澄清一下:

  • Z包含1个Y对象。
  • Y和Z都是P
  • 的子类
  • 如果您刷新图像似乎有效 - 我的声誉太低而无法上传图像,所以当我获得15分时我会进行编辑:)

3 个答案:

答案 0 :(得分:1)

你不能 - 假设你只想尝试在Y的实例上调用PrintWs,你需要确定哪些 指向实例的引用Y ...这就是你使用instanceof的地方。 (您可以使用Y.class.isInstance(p),但这只是略有不同的形式。)

当然如果你可以让P包含一个no-op PrintWs然后在Y中覆盖,那么你可以在列表中的所有内容上调用它...

答案 1 :(得分:0)

好吧,你可以尝试在try块中向下转换Y并抓住任何ClassCastException ...这不是我在代码中会做的事情,但是从字面上看,回答你的问题: - )

更好的解决方案是将PrintWs()(使用空的默认实现)向上移动到类P - 然后您可以在myPs的所有元素上调用它而无需向下转换。

答案 2 :(得分:0)

如果Y和Z是P的子类,则可以使用空实现将方法的声明移动到P并在Y中覆盖它。这样,您可以在ArrayList中的所有对象上调用该方法,但只能调用Y的实例将具有该方法的实现。