0

Java新手在这里。

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

Banana并且Apple两者都有(完全不同的)toString()方法。

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

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

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

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

必须有另一种方式,但我看不到它。

4

2 回答 2

2

我想做 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());
        }
    }
}

有关更多详细信息,请参阅Java 教程的继承部分。

于 2013-10-27T09:12:08.970 回答
0

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

于 2013-10-27T09:13:31.537 回答