Method override returns null
我是爪哇的新手。所以这个问题听起来很简单,但我被卡住了,无法理解为什么这段代码返回空值和0.0?
文件:transport.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| 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 ;
}
} |
文件:爪哇
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| 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;
}
} |
文件:Mav.java
1 2 3 4 5 6 7 8 9
| 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());
}
} |
产量
- 如果您的类被称为"car",则通常不需要将"car"放在属性名称中。您还可能希望尽早习惯重要的bean模式,并通过"get"和"set"给属性访问器加前缀。考虑这样的名字:car mycar=new car(…),mycar.getname())
您已经在Car中声明了单独的name和price变量,并且从未给它们赋值——它们与name和price变量(在Transport中声明(并初始化)不同。基本上,您可以看到String和double的默认值。去掉Car中的多余变量,用super.carPrice()从Transport中取原价:
1 2 3 4 5 6 7 8 9 10
| 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(),使其更为惯用。
- 好的,明白了。但是从Car类调用方法carPrice()的正确方法是什么?
- @杰拉尔达斯:我不知道你的意思。我已经在回答中向您展示了如何从Car调用Transport实现来调用原始方法,它只返回price变量…使用我的答案中的代码来替换你的类,这就是你所需要做的。
- 写评论的时候上面没有代码…谢谢你的帮助!:)
- @杰拉尔达斯:在你添加评论之前,代码已经存在了7分钟……
- @Gerardas调用继承方法的正确方法是:c.carprice()—如果从您的上下文中可以看到它(取决于它是否是公共的、包私有的、受保护的),那么它将出现在那里,就像您在车中声明它一样。
您正在通过super()将这两个值传递给父类传输。所以
1
| Car c = new Car("CarBrand", 1000); |
最终会设定
Transport class attributes name & price.
您不需要在car类中声明这两个属性。汽车将通过继承隐式地具有这两个属性。在这里,您将为汽车创建单独的属性。
创建car类型的"c"对象时,只为类传输的"name"和"price"变量分配值(因为在构造函数中,您调用将从父类调用构造函数的super(name,price)。
这里:c.car name()您从car类调用方法(因为标记为@override),而这个方法从car类返回'name'变量的值。在您的例子中,这个变量是空的,因为您还没有为它赋值。您为类型传输的"name"变量分配了值"carbrand"。"价格"变量也一样。
派生类Car隐藏了类Transport的实例变量,所以虽然您从Transport类继承了正确初始化的数据成员,但是初始化为默认值的Car类实例变量是从Car类方法返回的。
问题是,对于name,您有两个不同的变量,一个在车内,一个在运输中。c.carName()返回尚未初始化的Car.name。
如果你的汽车班是下面的那一班,那就可以了
1 2 3 4 5 6 7 8 9 10
| public class Car extends Transport {
public Car (String name, double price ) {
super(name, price );
}
@Override
public double carPrice (){
return price * 1.5;
}
} |
变量price也一样。
- 此修正给出了错误:Exception in thread"main" java.lang.Error: Unresolved compilation problem: The field Transport.price is not visible。