打印问题-继承,多态和toString

问题描述 投票:0回答:3

我正在练习如何使用toString(),多态性和继承。现在,我有了下面的代码,它具有我要打印的所有信息,并且确实可以打印,但是我有一些不需要的行。

enter image description here

我只需要第一行和第三行,但是我不确定为什么要打印其他三行。

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
3个回答
1
投票

只需从两个类的toString()方法中删除方法调用super.toString()。进行该调用时,您正在从父类中调用toString()方法。因此,当从NamedCar类调用它时,它从Car类调用toString()方法,而从Car类中调用时,则从对象类调用toString()。


1
投票

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

您定义为用户的所有类都是child类的Object。因此,您需要在代码的这一部分中调用Object.toString()方法:

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

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


0
投票

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

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

-对象-汽车延伸物体-NamedCar扩展Car

当创建并打印汽车时,它将调用Object中定义的toString()方法,并且它将向您返回此特定对象(在本例中为Car的实例)的hashCode。当您编写自己的公共String toString()方法(已完成)并尝试再次打印Car时,它将调用Car Class的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()因此它将随后调用Class Car的相应方法。

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

int speed;
int gear;
public String color;

所以当super.toString()被调用并使用它们时,您将它们放在第四行。

© www.soinside.com 2019 - 2025. All rights reserved.