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

Problem with printing - Inheritance, Polymorphism and toString

我正在练习如何使用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(); 
    }
}

当您调用 super.toString() 时,您是在 child class.[=20= 中调用 parent class 的 toString() 方法]

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

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

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

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

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

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

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

当您创建并打印 Car 时,它会调用 Object 中定义的 toString() 方法,并且它 returns 您是这个特定对象(在本例中为 Car 的实例)的 hashCode。当您编写自己的 public String toString() 方法(正如您所做的那样)并尝试再次打印 Car 时,它将调用 Car Class 的 toString() 并因此打印您的

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

但是你也在调用 super.toString();它将转到父级 class 并获取其 toString() 的值,因此是对象的 hashCode 表示形式。

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

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

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

但随后您通过 super.toString() 包含父 class 的 toString() 因此它将调用 Class Car 的相应方法。

但是,由于NamedCar也是Car,所以也用到了Car中定义的字段, 即:

int speed;
int gear;
public String color;

所以当 super.toString() 被调用并使用它们时,你会在第 4 行得到它们。