【问题标题】:How to call a subclass method from superclass?如何从超类调用子类方法?
【发布时间】:2013-10-27 09:10:27
【问题描述】:

这里是 Java 新手。

Banana and Apple extend Fruit(Fruit 也可能是一个抽象类,因为永远不会实例化 Fruit)。

Banana 和 Apple 都有一个(完全不同的)toString() 方法。

某处的方法——我们称之为processFruit(Fruit fruit)——接受Fruit作为参数,然后调用实际接收到的Fruit的toString()方法(意思是香蕉或苹果),用于记录目的。我该怎么做?

我想做 fruit.toString() 并让它根据水果的实际情况运行 Apple.toString() 或 Banana.toString() 方法。

我不想做的事情(因为水果很多,不只是苹果和香蕉):

  1. 有两个不同的processFruit 方法,processFruit(Banana banana) 和processFruit(Apple apple),因为代码相同
  2. 将收到的水果向下转换为 Apple 或 Banana,然后调用其 toString() 方法

一定有别的办法,但我看不到。

【问题讨论】:

标签: java subclass superclass


【解决方案1】:

我想做 fruit.toString() 并让它根据水果的实际情况运行 Apple.toString() 或 Banana.toString() 方法。

这正是会自动发生的,只要你真的覆盖了现有的无参数toString() 方法。这就是方法覆盖的工作原理。

如果您想对toString()(在Object 中声明)以外的方法执行此操作,您需要在Fruit 中创建一个抽象方法,然后在每个子类中实现它。然后,您可以在任何 Fruit 实例上调用它,并且将调用正确的实现。

完整示例:

import java.util.*;

abstract class Fruit {
    public abstract String getColor();
}

class Banana extends Fruit {
    @Override public String getColor() {
        return "yellow";
    }
}

class Apple extends Fruit {
    @Override public String getColor() {
        return "green";
    }
}

public class Test {

    public static void main(String[] args) {
        List<Fruit> list = new ArrayList<Fruit>();
        list.add(new Banana());
        list.add(new Apple());

        for (Fruit fruit : list) {
            System.out.println(fruit.getColor());
        }
    }
}

有关详细信息,请参阅inheritance part of the Java tutorial。

【讨论】:

  • 您还可以在Fruit 中创建一个abstract toString 方法,这将强制扩展类实现自己的版本。
  • @BoristheSpider:是的,没错。
  • 谢谢...我错过了整个@Override 概念!
【解决方案2】:

只需致电fruit.toString()。如果水果是香蕉,那么会调用香蕉的toString() 方法。如果是 Apple,则将调用 Apple 的 toString() 方法。这就是多态性的全部意义所在。

【讨论】:

  • 我很确定这是我尝试的第一件事,但我得到了一个错误;现在无法测试它,但我会尝试回过头来解释错误是什么。
猜你喜欢
  • 2011-12-08
  • 1970-01-01
  • 2011-10-24
  • 2012-04-18
  • 1970-01-01
相关资源
最近更新 更多