我是Java的新手 . 所以问题可能听起来很简单,但我陷入困境,无法弄清楚为什么这段代码返回null和0.0?
file: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;
}
}
file: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
4 回答
问题是
name
有两个不同的变量,一个在Car中,一个在Transport中 .c.carName()
返回尚未初始化的Car.name
.如果你的汽车类是下面的那个,它会起作用
变量
price
也一样派生类
Car
隐藏了类Transport
.So的实例变量,尽管您从Transport
类继承了正确初始化的数据成员,但是从Car
类方法返回的Car
类实例变量已初始化为其默认值您通过super()将值传递给父类Transport . 所以
最终会成立
您不需要在Car类中声明这两个属性 . Car将通过继承隐式地拥有这两个属性 . 在这里,您将为Car创建单独的属性 .
您已在
Car
中声明了单独的name
和price
变量,并且从未为它们分配值 - 它们与Transport
中声明(和初始化)的name
和price
变量不同 . 所以你基本上看到了String
和double
的默认值 . 摆脱Car
中的那些额外变量,并使用super.carPrice()
从Transport
获取原始价格:请注意,除非您真的希望它改变行为,否则根本不需要覆盖
carName()
.我还建议将
carName()
和carPrice()
更改为getName()
和getPrice()
更加惯用 .