当前位置: 首页 > 知识库问答 >
问题:

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

蒋俊人
2023-03-14

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

共有2个答案

姚臻
2023-03-14

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

公共字符串toString()

没有方法体。

在任何情况下,toString()都继承自所有类的父类,对象

如果您的类形状扩展了geometricObject并定义了自己的toString(),那么是的,您将获得形状类的-toString()。

有关方法重写的更多信息,请参见http://docs . Oracle . com/Java se/tutorial/Java/IandI/override . html

段干麒
2023-03-14

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

无论基类是实现 toString() 方法,还是只是声明它,都是如此。对于所有其他方法也是如此 - toString() 并不特别,因为它是 Object 基本协定的一部分。

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

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

 类似资料:
  • 假设我有一个继承链,其中每个类都通过添加一个新字段来扩展其超类,我希望该链的每个类都覆盖方法,如下所示: 如果我使用抽象基类,那么当继承链的一个类通过实现抽象方法变得具体时,从那时起的所有子类也通过继承已经实现的方法变得具体。 Java中有没有一种方法可以强制每个类重写(重新实现)抽象方法,即使它已经在继承链中实现得更高?

  • 想象一下,我有一个抽象类动物的方法: 然后我有一个类,用以下内容扩展这个抽象类: 我希望每个扩展Animal的类都有一个fetch()方法。然而,fetch方法为相关动物指定了一些独特的特征(狗的爪子、猫的爪子等)。例如,cat的fetch()将获取参数fetch(fellinecat kitty)并表示: 因此,抓取方法接受了扩展抽象类“动物”(因此是动物)的参数。我在“动物”中定义了抓取()方

  • 问题内容: 因此,我一直在为编程类编写抽象作业,但遇到了问题。我现在的目标是能够使用抽象,然后能够使用矩形和椭圆形绘制一个简单的城市,例如矩形建筑物或灯柱上的椭圆形灯。 我在编译时收到的错误是:MyTestApp.Rectangle不是抽象的,并且不会覆盖MyTestApp.Shape中的抽象方法drawEllipse(java.awt.Graphics)。该错误显示在类Shape下方的“矩形扩展

  • 我有一个关于JPA中继承的问题,是否可以使用JOINED策略来实现这个层次结构? 这是我的代码: 在上面的层次结构之后,我尝试使用JPQL进行查询,这是查询: 此代码从主代码运行 当我运行该查询时,会抛出以下错误 导致原因:com . MySQL . JDBC . exceptions . JDBC 4 . MySQL syntaxerrorexception:未知列“employee1_。“字段

  • 类继承 在面向类的语言中,你不仅可以定义一个能够初始化它自己的类,你还可以定义另外一个类 继承 自第一个类。 这第二个类通常被称为“子类”,而第一个类被称为“父类”。这些名词显然来自于亲子关系的比拟,虽然这种比拟有些扭曲,就像你马上要看到的。 当一个家长拥有一个和他有血缘关系的孩子时,家长的遗传性质会被拷贝到孩子身上。明显地,在大多数生物繁殖系统中,双亲都平等地贡献基因进行混合。但是为了这个比拟的

  • 我尝试在android studio中使用Proguard,但Proguard似乎没有混淆类名,例如,我的应用程序结构和配置: 和配置 但当我尝试在应用程序中触发异常时: ADB控制台中列出了异常: 只有方法被混淆了,MainActivity.class没有