与抽象类的继承混淆。方法是否相互覆盖?

时间:2014-04-02 17:21:09

标签: java inheritance methods abstract-class overwrite

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

2 个答案:

答案 0 :(得分:4)

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

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

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


PS:您应该使用Java中的@Override来注释被覆盖的方法,例如toString(),以使其更明确地识别 - 很多工具/ IDE都可以使用这个概念。

答案 1 :(得分:0)

如果你的geometricObject类是抽象的,那么toString()方法的所有内容就是:

public String toString();

没有方法体。

在任何情况下,toString()都是从所有类的父级Object继承的。

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

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