我正在练习如何使用toString(),多态性和继承。现在,我有了下面的代码,它具有我要打印的所有信息,并且确实可以打印,但是我有一些不需要的行。
我只需要第一行和第三行,但是我不确定为什么要打印其他三行。
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();
}
}
只需从两个类的toString()方法中删除方法调用super.toString()。进行该调用时,您正在从父类中调用toString()方法。因此,当从NamedCar类调用它时,它从Car类调用toString()方法,而从Car类中调用时,则从对象类调用toString()。
当您调用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
方法的一部分。
在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()被调用并使用它们时,您将它们放在第四行。