第16课 - 燃气里程 - 多个班级项目

时间:2011-09-25 06:42:18

标签: java

~~~更新:解决了!谢谢大家!~~~

我正在研究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

5 个答案:

答案 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的局部变量,该变量未赋值。在构造函数的末尾,实例变量gallonsmpg都将为零 - 这意味着您将在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;
             }