方法覆盖返回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