方法覆盖返回null
我是Java新手。 所以问题可能听起来很简单,但我卡住了,不知道为什么这个代码返回null和0.0?
文件:Transport.java
public class Transport {
private String name;
private double price;
public Transport(String name, double price) {
this.name = name;
this.price = price;
}
public String carName() {
return name;
}
public double carPrice(){
return price;
}
}文件:Car.java
public class Car extends Transport{
protected String name;
protected double price;
public Car(String name, double price) {
super(name, price);
}
@Override
public String carName(){
return name;
}
@Override
public double carPrice(){
return price * 1.5;
}
}文件:Main.java
public class Main {
public static void main(String[] args) {
Car c = new Car("CarBrand", 1000);
System.out.println("Name: " + c.carName());
System.out.println("Price: " + c.carPrice());
}
}产量
Name: null Price: 0.0
您已在Car声明单独的name和price变量,并且从未为它们分配值 - 它们与Transport声明(和初始化)的name和price变量不同。 所以你基本上看到了String和double的默认值。 在Car摆脱这些额外的变量,并使用super.carPrice()从Transport获取原始价格:
public class Car extends Transport {
public Car(String name, double price) {
super(name, price);
}
@Override
public double carPrice(){
return super.carPrice() * 1.5;
}
}
请注意,除非您真的希望它改变行为,否则不需要重写carName() 。
我还建议将carName()和carPrice()更改为getName()和getPrice()以更加习惯。
您通过super()将这两个值传递给父类Transport。 所以
Car c = new Car("CarBrand", 1000);
将最终成立
运输类属性名称和价格。
您不需要在Car类中声明这两个属性。 汽车将通过继承隐含两个属性。 这里您正在为Car创建单独的属性。
问题在于你有两个不同的name变量,一个在Car中,另一个在Transport中。 c.carName()返回尚未初始化的Car.name 。
如果你的汽车课程是下面的课程,它将会起作用
public class Car extends Transport {
public Car(String name, double price) {
super(name, price);
}
@Override
public double carPrice(){
return price * 1.5;
}
}
price
