繁体   English   中英

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

[英]How to call a subclass method from superclass?

Java新手在这里。

Banana and Apple extend FruitFruit也可能是一个抽象的类,因为没有水果将永远定形)。

BananaApple都有一个(完全不同的) 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()方法

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

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

正是自动发生的事情,只要你真的重写现有的无参数toString()方法。 这就是方法覆盖的工作方式。

如果你想为toString() (在Object声明toString()之外的方法执行此操作,则需要在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教程继承部分

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM