如何从超类调用子类方法?

时间:2013-10-27 09:10:27

标签: java subclass superclass

Java新手在这里。

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

BananaApple都有(完全不同的)toString()方法。

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

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

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

  1. 有两个不同的Fruit方法,processFruitprocessFruit(Banana banana),因为代码相同
  2. 将收到的水果向下倾斜到Apple或Banana,然后调用其processFruit(Apple apple)方法
  3. 必须有另一种方式,但我看不到它。

2 个答案:

答案 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()方法。这就是多态性的全部意义。