我在打印变量priceUsed
时遇到问题
在方法getPriceAfterUse()
获取我的值后,方法OutputDetails
应该打印所有信息。但是变量priceUsed
被打印0.0
。我不知道为什么。
这是我的代码:
import java.util.Scanner;
class Car
{
public String brandName;
public String color;
public double priceNew, priceUsed;
public double odometer;
public double getPriceAfterUse()
{
priceUsed = priceNew*(1-(odometer/6000000));
return priceUsed;
}
public double updateMilage()
{
Scanner keyboard = new Scanner(System.in);
odometer = keyboard.nextDouble();
return odometer;
}
public void outputDetails()
{
System.out.println("The car brand name is : " + brandName);
System.out.println("The car new price: " + priceNew);
System.out.println("The car used price: " + priceUsed);
System.out.println("The car color: " + color);
System.out.println("The car Odemeter: " + odometer );
}
}
public class CarTest{
public static void main(String args[])
{
Scanner keyboard = new Scanner (System.in);
Car a = new Car();
System.out.println("Enter you car Brand Name: ");
a.brandName = keyboard.next();
System.out.println("Enter your car color: ");
a.color = keyboard.next();
System.out.println("Enter your new price: ");
a.priceNew = keyboard.nextDouble();
System.out.println("Enter your Odometer:");
a.updateMilage();
System.out.println();
a.outputDetails();
System.out.println();
}
}
答案 0 :(得分:3)
public double getPriceAfterUse()
{
priceUsed = priceNew*(1-(odometer/6000000));
return priceUsed;
}
只有此方法设置priceUsed
的值,并且在outputDetails()
之后才会调用它,因此这是您无法获得正确结果的原因。
然而,这里有一个更重要的问题:根据经验,称为getSomething()
的方法除了返回值之外不应该做任何事情。他们当然不能从外面看到任何副作用。
更一般地说,方法应该有名称,尽可能地描述他们的行为。误导性的方法名称可能会给你带来很多痛苦。
您应该注意的另一件事是尝试将对象保持在一致状态。正如您所注意到的,priceUsed
在里程数时不会自动更新,即使它是里程数的函数。它也是priceNew
的函数,也可以单独设置,因此除非按正确的顺序调用每个方法,否则会出现不一致的状态。解决方案是让一次操作立即更新所有这些操作:
public void updateValue( double priceNew, double odometer ) {
this.priceNew = priceNew;
this.odometer = odometer;
this.priceUsed = priceNew * (1.0d - ( odometer / 6000000.0d ) );
}
答案 1 :(得分:2)
在设置PricedUsed的值之前,您正在调用OutputDetails。
如果查看最后一行的输出
的System.out.println(a.getPriceAfterUse());
这是正确的,因为它是第一次调用它。也许您可以将getPriceAfterUse()调用添加到OutputDetials方法,以便每次显示值时更新使用的价格。
修改强>
要解决这个问题,你可以这样做。
public void outputDetails() {
//Calculate the used price before outputting the value
getPriceAfterUse()
System.out.println("The car brand name is : " + brandName);
System.out.println("The car new price: " + priceNew);
System.out.println("The car used price: " + priceUsed);
System.out.println("The car color: " + color);
System.out.println("The car Odemeter: " + odometer );
}
或在测试脚本中,您可以执行此操作。
Scanner keyboard = new Scanner (System.in);
Car a = new Car();
System.out.println("Enter you car Brand Name: ");
a.brandName = keyboard.next();
System.out.println("Enter your car color: ");
a.color = keyboard.next();
System.out.println("Enter your new price: ");
a.priceNew = keyboard.nextDouble();
System.out.println("Enter your Odometer:");
a.updateMilage();
System.out.println();
//UPDATE THE USED PRICE
a.getPriceAfterUse();
a.outputDetails();
System.out.println();
编辑#2:
这就是我认为你的问题所在。
你有一个类汽车,你有变量brandName,color,priceNew,priceUsed和里程表。
我相信您正在混淆方法的 return 语句并设置变量的值。
当你致电Car a = new Car();你已经创建了一个新的Car Object。现在假设在这个car元素内部,所有变量(在本例中为brandName,color,priceUsed等)都是空的。
您正在通过调用\:
来设置其值a.brandName = "something"
a.color = "some color"
a.priceNew = "some value"
所以现在已经设置了所有这些值...除了里程表和priceUsed
用
设置里程表a.updateMilage();
然后你打电话给:
a.outputDetails();
但是在这条命令链中你改变了甚至设置了priceUsed的价值?你还没有这样做。因此,当您调用outputDetails时,它将打印出Car Object中的所有值。由于你没有设置priceUsed的值,它将打印出0.0
请记住,函数中的返回不会设置它只是将值发送回任何调用它的值...这就是值如何传递回System.out.println,例如
System.out.println(a.getPriceAfterUse())将在使用后打印出计算出的价格,并且打印的值是public double getPriceAfterUse()方法返回的值。
但是当您运行
行时,对象内的变量priceUsed的值为SETpriceUsed = priceNew*(1-(odometer/6000000));
在我们运行之前,我们在Car对象中运行priceUsed的值将打印出0.0
嗯... TLDR:)