java - 与抽象类的继承混淆。方法会互相覆盖吗?

标签 java inheritance methods abstract-class overwrite

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

最佳答案

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

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

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


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

关于java - 与抽象类的继承混淆。方法会互相覆盖吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22818613/

相关文章:

java 日志记录噩梦和 log4j 在 spring + tomcat6 中的行为不符合预期

java - 在java程序关闭之前调用方法

Java方法不返回输出?

java - 编译器给出 “error: cannot find symbol”消息。我认为这与方法有关

java - 带有 {"key"=> JSON 的 Android HTTP post}

java - 关于 ReentrantReadWriteLock 的文档矛盾。在公平模式下,最终写锁是否优先于读锁?

javascript - 如何在 Google Closure 中使用 var_args 调用父类的构造函数?

c++ - C++中的不明确访问错误

java - Java中的静态变量继承

java - 我需要将监听器添加到复选框,并且选择的更改显示在 textArea 中