【问题标题】:Confused with inheritance with abstract class. Do methods overwrite each other?与抽象类的继承混淆。方法会相互覆盖吗?
【发布时间】:2014-05-14 03:48:54
【问题描述】:

我有三个类,一个测试类、一个形状类和一个几何对象类。 shape 类扩展了 geometryObject 类(geometricObject 类是抽象的)。问题是,shape 类和 geometryObject 具有相同的 toString 方法,但两者的内容不同。当我在测试类中调用 toString 方法时,我从 shape 类中的 toString 方法中得到结果。当我尝试将创建的对象转换为 geometryObject 类并尝试在那里调用 toString 方法时,我仍然从 shape 类的 toString 方法中得到相同的结果。那么如果抽象/子类中的方法具有相同的名称/参数列表,超类是否会覆盖它们?

【问题讨论】:

    标签: java inheritance methods abstract-class overwrite


    【解决方案1】:

    您在此处看到的行为是由于多态性和函数重载造成的。如果在基类和派生类中都有 toString() 方法,它将始终调用派生类中 toString() 方法的最派生版本。无论您如何持有对派生类的引用(例如,在派生类引用、基类引用或对象引用中)。

    无论基类实现了 toString() 方法,还是仅仅声明了它,都是如此。对于所有其他方法也是如此 - toString() 并不特别,除了它是 Object 基本合同的一部分。

    因此,即使您将派生类转换为 Object 并在其上调用 toString(),您也会在此处看到相同的行为。


    PS:您应该注释您的重写方法,例如在 Java 中使用 @Override 的 toString() 以使其更明确地可识别 - 许多工具/IDE 都在这个概念上工作。

    【讨论】:

    • 我现在明白了。谢谢!
    • 没问题,乐于助人:)
    【解决方案2】:

    如果你的 geometricObject 类是抽象的,那么它对于 toString() 方法所能拥有的就是:

    public String toString();.

    没有方法体。

    无论如何,toString() 继承自所有类的父类 Object

    如果您的class Shape extends geometricObject 并定义了自己的toString(),那么是的,您将得到Shape 类的toString() 中指定的内容。

    有关方法覆盖的更多信息,请参阅http://docs.oracle.com/javase/tutorial/java/IandI/override.html

    【讨论】:

    • 抽象类中可以有具体方法。
    • 如果方法不是抽象的,那么你必须确保它至少有一个空的主体{},否则它不会编译。也许你把抽象类和接口混淆了。
    • 抽象类类似于接口。你不能实例化它们,它们可能包含声明的有或没有实现的混合方法。 @docs.oracle.com/javase/tutorial/java/IandI/abstract.html
    猜你喜欢
    • 2023-03-29
    • 2019-12-09
    • 2012-11-20
    • 2017-03-31
    • 1970-01-01
    • 2015-02-07
    • 2013-11-11
    • 2014-06-20
    相关资源
    最近更新 更多