~~~更新:解决了!谢谢大家!~~~
我正在研究Blue Pelican Java书中的一个项目,第16课项目Gas Mileage。它要求创建两个类,一个是Automobile,它包含我将使用的方法。另一个类,Tester,是主要类。每次运行Tester类时,它都会返回-Infinity值。我无法弄清楚为什么,除了我已经挑出问题的是在takeTrip方法的第14行的Automobile类中。当我将该方法从Tester类中删除时,它将返回正确的值。
这是汽车类:
public class Automobile
{
public Automobile(double m) // Accepts value m to the double mpg. Also declares
{
double mpg = m;
double gallons;
}
public void fillUp(double f) // Adds fuel to the tank
{
gallons += f;
}
public void takeTrip(double t) // Takes away fuel from the tank depending upon how many miles are driven
{
gallons -= t / mpg; // Not sure how to do this line. For some reason, when I reference mpg, the output of Tester is "-infinity". Shouldn't it do gallons = gallons - (miles driven / mpg)?
}
public double reportFuel() // Returns value of how much fuel is left in tank
{
double r = gallons;
return r;
}
public double mpg;
public double gallons;
}
这就是测试者课程:
public class Tester
{
public static void main(String args[])
{
Automobile myBmw = new Automobile(24); // Passes constructor argument of 24 mpg
myBmw.fillUp(20); // Adds 20 gallons to fillUp method
myBmw.takeTrip(100); // Takes away the fuel used for 100 miles using the takeTrip method
double fuel_left = myBmw.reportFuel(); // Initializes fuel_left to the method reportFuel
System.out.println(fuel_left);
}
}
感谢任何帮助,谢谢! -AJ
答案 0 :(得分:4)
构造函数不需要'double'标识符。在这里,您要创建一个名为mpg的 new 变量 ,这在构造函数完成后会被遗忘。而是使用它:
public Automobile(double m) // Accepts value m to the double mpg. Also declares
{
mpg = m;
}
答案 1 :(得分:4)
这是问题所在:
public Automobile(double m) // Accepts value m to the double mpg. Also declares
{
double mpg = m;
double gallons;
}
这是声明名为mpg
的 local 变量,而不是更改对象的实例变量的值。 (实例变量在类的底部声明。)然后声明另一个名为gallons
的局部变量,该变量未赋值。在构造函数的末尾,实例变量gallons
和mpg
都将为零 - 这意味着您将在takeTrip
方法中除以零 - 因此您将减去“无限加仑“来自油箱,导致你的最终结果。你的构造函数应该是这样的:
public Automobile(double m)
{
this.mpg = m;
}
或只是:
public Automobile(double m)
{
mpg = m;
}
如果您在此之后仍然不确定局部变量和实例变量,请查看本书前面是否有任何可能对您有帮助的内容。 (到第16课,我期待它已被覆盖......)
答案 2 :(得分:1)
在Automobile
c'tor中,您当前正在创建一个名为mpg的 local 变量,而不是更改类成员。该函数中应该只有mpg = m;
(第二行什么都不做)。
目前,mpg(成员)自动初始化为0,然后t / mpg为无穷大,当你从某个有限数字中取出时,你得到-infinity。
顺便说一句,在reportFuel()
中,您也可以只写return gallons;
,而不会声明r
。
答案 3 :(得分:0)
为什么再次在构造函数中声明属性,因为您已经在类中声明了它们。实际上,在方法执行结束后(在这种情况下是构造函数),您在构造函数中声明的属性将不会持久存在。因此,虽然您尝试初始化类的属性,但实际上并没有这样做。
所以在你的构造函数中试试这个
mpg=m
gallons=0
我认为其他方法都很好。另一件事是试图将这些属性(mpg和加仑)保密。虽然程序运行没有任何错误,但你仍然违反了oop封装的主要内容。欢呼:)
答案 4 :(得分:0)
public class Automobile {
private double mpg = 0; //need to handle the division by 0 if you
//initialize it to 0
private double gallons = 0;
public Automobile(double m, double g)
{
mpg = m;
gallons = g;
}