【问题标题】:Problem with printing - Inheritance, Polymorphism and toString打印问题 - 继承、多态性和 toString
【发布时间】:2020-06-02 05:19:43
【问题描述】:

我正在练习如何使用 toString()、多态和继承。现在我有下面的代码,它包含我想要打印的所有信息,它确实打印但我有一些不需要的行。

我只需要第 1 行和第 3 行,但我不太确定为什么它会打印出其他 3 行。

public class Test_toString{
    public static void main(String[] args){
        Car c = new Car();
        System.out.println(c.toString());

        NamedCar c2 = new NamedCar(160, 8, "green", "Pony");
        System.out.println(c2.toString());
    }
}

class Car{
    int speed;
    int gear;
    public String color;

    public Car(){
        speed = 100;
        gear = 5;
        color = "silver";
    }

    public Car(int speed, int gear, String color){
        this.speed = speed;
        this.gear = gear;
        this.color = color;
    }

    public String toString(){
        return "Car: " + speed + "km/h " + gear + " gears " +
        color + "\n" + super.toString();
    }
}

class NamedCar extends Car{
    public String name;

    public NamedCar(String name){
        super();
        this.name = name;
    }

    public NamedCar(int speed, int gear, String color, String name){
        this.speed = speed;
        this.gear = gear;
        this.color = color;
        this.name = name;
    }


    public String toString(){
        return "Car: " + speed + "km/h " + gear + " gears " +
        color + " " +  name + "\n" + super.toString(); 
    }
}

【问题讨论】:

    标签: java inheritance polymorphism tostring


    【解决方案1】:

    只需从两个类中的 toString() 方法中删除方法调用 super.toString() 即可。 当您进行该调用时,您正在从父类调用 toString() 方法。所以当它从 NamedCar 类调用时,它从 Car 类调用 toString() 方法,当它从 Car 类调用时,它从 object 类调用 toString()。

    【讨论】:

      【解决方案2】:

      当您调用super.toString() 时,您正在调用child 类中parent 类的toString() 方法。

      您定义为用户的所有类都是Object 类的child。所以你在这部分代码中调用 Object.toString() 方法:

      public String toString(){
          return "Car: " + speed + "km/h " + gear + " gears " +
          color + "\n" + super.toString();
      }
      

      这是Car 类的toString() 方法的一部分。

      【讨论】:

        【解决方案3】:

        在 Java 中,所有类默认扩展 Object,因此它们可以使用其中定义的方法,例如 hashCode() 或 toString(),其中 toString() 默认返回对象的哈希表示。

        现在回到你的例子。 您有这样的继承设置

        -- 对象 -- 汽车扩展对象 -- NamedCar 扩展 Car

        当您创建 Car 并打印它时,它将调用 Object 中定义的 toString() 方法,并返回此特定对象的 hashCode(在本例中为 Car 的实例)。当您编写自己的公共 String toString() 方法(如您所做的那样)并尝试再次打印 Car 时,它将调用 Car 类的 toString() 并因此打印您的

        "Car: " + speed + "km/h " + gear + " gears " + color + "\n"
        

        但是你也调用了 super.toString();它将转到父类并获取其 toString() 的值,从而得到对象的 hashCode 表示。

        现在 - 快进到 NamedCar。正如您可能已经猜到的那样,它遵循相同的原则。

        在此处调用 toString() 方法时,它会打印您正确的详细信息

        "Car: " + speed + "km/h " + gear + " gears " + color + " " +  name 
        

        但是你通过 super.toString() 包含父类的 toString() 因此它将调用 Car 类的相应方法。

        但是,由于NamedCar也是一个Car,它也使用了Car中定义的字段, 即:

        int speed;
        int gear;
        public String color;
        

        因此,当调用 super.toString() 并使用它们时,您会将它们放在第 4 行。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-07-19
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多