双局部变量打印为0.0而不是设定值

时间:2011-05-08 15:08:35

标签: java

我在打印变量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();


 }
 }

2 个答案:

答案 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的值为SET
priceUsed = priceNew*(1-(odometer/6000000));

在我们运行之前,我们在Car对象中运行priceUsed的值将打印出0.0

嗯... TLDR:)