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