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

如何从父类而不是超类调用被覆盖的方法?

燕光熙
2023-03-14

我有一个抽象类,割草机,它覆盖了toString()方法。草坪拖拉机类扩展了割草机。它覆盖了toString()方法,并调用super.toString()作为方法的第一行。然后我有一个商业类,它扩展了劳恩拖拉机并覆盖了toString(),也在第一行调用super.toString()。当实例化一个商业对象(声明为割草机对象)并调用它的toString()时,我希望它打印割草机和草坪拖拉机的两个属性,然后打印它自己的属性。相反,它只打印割草机的属性,然后打印它自己的属性。如何调用或重写商业中的toString()方法,使其调用其父类(LawnTrtor)toString()而不仅仅是超类(割草机)。

public abstract class Mower {
   private String manufacturer;
   private int year;
   private String serialNumber;

   public String tostring(){
       String temp = "Manufacturer: " + getManufacturer() + "\nYear: " + getYear() + "\nSerial Number:" + getSerialNumber() + "\n";
       return temp;
   }
}
public class LawnTractor extends Mower{
   private Engine engine = new Engine();
   private String model;
   private double deckWidth;

   public LawnTractor(){
      super();
   }

   public String toString(){
      String temp = super.tostring() + "Engine:\n" + getEngine().toString() + "\nModel: " + getModel() + "\nDeck Width: " + getDeckWidth() + "\n";
      return temp;
}
public class CommercialMower extends LawnTractor {
    private double operatingHours;
    private boolean zeroTurnRadius;

    public CommercialMower(){
       super();
    }
    public String toString(){
       String temp = super.toString() + "Operating Hours: " + getOperatingHours() + "\nZero Turn Radius: " + isZeroTurnRadius() + "\n";
       return temp;
}

共有2个答案

晋坚
2023-03-14

我意识到我的错误。我的Mower类有tostring()方法,但没有重写tostring()法(语法上的差异)。

公良育
2023-03-14

所以听起来好像你在尝试创建一个toStrings的层次结构,当你有一个对象的图形时,就可以打印出来。因此,您所需要做的就是在链上调用super的toStrings时追加它们。(如果我没理解错的话)

这是割草机课

public class Mower {
    @Override
    public String toString() {
        return "Mower toString\n";
    }
}

朗特

public class LawnTractor extends Mower {
    @Override
    public String toString() {
        String superString = super.toString();
        return superString + "LawnTractor toString\n";
    }
}

贸易的

public class Commercial extends LawnTractor {
    @Override
    public String toString() {
        String superString = super.toString();
        return superString + "Commercial toString\n";
    }
}

运行它的主类。请参见下面的输出。这就是你要说的吗?

public class Main {
    public static void main(String[] args) {
        Mower mow = new Commercial();
        System.out.println(mow.toString());

    }
}

这是你的输出。我相信这就是你要找的。如果没有,请澄清

Mower toString
LawnTractor toString
Commercial toString

可以对对象在返回字符串中的显示顺序进行重新排序,具体取决于将它们追加在一起的方式。割草机可以是第一个,也可以是最后一个。

 类似资料:
  • 问题内容: 我需要一些有关ajax的liferay方面的帮助。现在,我正在从页面调用ajax方法来提交一些数据。 这是我正在使用的示例代码: 在我的课程中,有一种方法被此ajax调用所调用: 所以我的问题是,现在它只是通过任何ajax类的默认方法进行校准。但是如何在ajax调用中调用类的特定方法? 我是ajax的新蜜蜂。所以无论如何请引导我..... 使用以下网址调用ajax时出现以下错误 我的流

  • 问题内容: 让我们看一下这段代码: 我希望这能打印出“孩子”,但结果是“父母”。为什么Java会改为调用父类,我该怎么做才能使其在子类中调用方法? 问题答案: 不会覆盖,因为它没有相同的形式参数。一个拿走,另一个拿走。因此,运行时的多态不会被应用,并且不会导致子类方法的执行。根据Java语言规范: 如果满足以下所有条件,则在类C中声明或由类C继承的实例方法从类C中 重写 另一个在类A中声明的方法:

  • 如果类A中的方法调用类B中的父方法,该方法调用类B中的方法X,该方法X在类A中被重写,将调用方法X的哪个实现?子类A中的重写实现还是父类B中的原始实现? 从我的代码中,我看到重写方法被调用,但是我想象如果一个方法是从一个类中调用的,那么这个方法就不会是子类中的重写方法。我猜如果一个子类调用父类中的一个方法,该方法调用子类中重写的方法,重写的方法将被调用?那是对的吗?为什么啊?

  • 问题内容: 我想为 isEmpty 方法添加自定义行为。 当我从 我应该重写序列化方法,因为它是抽象的。 我想按原样保留序列化方法,并仅覆盖isEmpty方法。 问题答案: 为了修改行为但保持默认的序列化,您可以利用 serializer修饰符 。您仍然必须实现自定义序列化程序,但是可以非常干净地利用默认序列化程序。 使用默认的序列化器创建一个自定义序列化器 将变量插入到您的自定义序列化器类中。当

  • 问题内容: 我正在尝试从open jdk更改某些类,所以我正在创建与open jdk类相同的包结构,并且正在使用netbeans更改类。当我在构建项目时,如果覆盖类中出现问题,我会收到错误消息。如果成功构建了我的项目,则应用程序似乎不考虑我对类的更改,而是使用打开的jdk类。知道我该如何使用我的类而不是openjdk的类? 例: 如果我在项目中创建类 _sun.net.www.protocol.h

  • 问题内容: 在UIViewController中,此代码: 给出错误 我正在使用Xcode 8 beta 4,且iOS部署目标是9.0,并且在 如何将上面的代码转换为Swift 3? 问题答案: 像这样: …还有其余的。 一般模式 现在,许多Cocoa方法都是属性,因此您可以将它们实现为重写计算变量。因此,从种子3(或更早)移动到种子4的模式是: 更改为 删除 更改为 之所以可行,是因为计算的变量