打印问题 - 继承、多态和 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 行得到它们。
我正在练习如何使用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 行得到它们。