Java新手在这里。
Banana and Apple extend Fruit
(Fruit
也可能是一个抽象类,因为没有Fruit会被实例化。)
Banana
和Apple
都有(完全不同的)toString()
方法。
某个方法 - 让我们称之为processFruit(Fruit fruit)
- 接受Fruit
作为参数,然后调用收到的实际toString()
的{{1}}方法(意思是,用于记录目的的香蕉或苹果。我该怎么做?
我想做fruit.toString()并让它根据实际的果实运行Apple.toString()或Banana.toString()方法。
我不想做的事(因为有很多水果,不仅仅是苹果和香蕉):
Fruit
方法,processFruit
和processFruit(Banana banana)
,因为代码相同processFruit(Apple apple)
方法必须有另一种方式,但我看不到它。
答案 0 :(得分: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());
}
}
}
有关详细信息,请参阅inheritance part of the Java tutorial。
答案 1 :(得分:0)
只需致电fruit.toString()
即可。如果水果是香蕉,那么将调用香蕉的toString()
方法。如果它是Apple,那么将调用Apple的toString()
方法。这就是多态性的全部意义。