0

这是我的第一篇文章,如果做得不对,请见谅。该程序适用于我的 AP 计算机科学课程(我不想要代码示例,只是解释为什么会发生这种情况)。每当我尝试从对象中获取变量时,都会收到一条错误消息,指出该变量不存在(NetBeans IDE)。提前致谢!

这是代码:

public class AnnualFuelTester 
{   
    public static void main(String [] args)
    {
        AnnualFuelUse Fill1 = new AnnualFuelUse(1, 1,  45023, 45231, 10.00, 2.95);
        AnnualFuelUse Fill2 = new AnnualFuelUse(2, 4,  45231, 45480, 11.70, 2.99);
        AnnualFuelUse Fill3 = new AnnualFuelUse(3, 8,  45480, 45659,  9.30, 3.03);
        AnnualFuelUse [] FillArray = {Fill1, Fill2, Fill3};

        System.out.println("Fillup    Days    Start Miles    Distance    Gallons        Consumed    MpG    Fuel Price    Cost");
        **int temp = Fill1.distance;**
        System.out.printf ("%4.1f     %4.1f   %4.1f          %4.1f       %4.1f                   %4.1f  %4.1f         %4.1f", );
    }
}

(编辑:)年度燃料使用:

public class AnnualFuelUse 
{
    private int dist = 0;
    private double MpG = 0;
    private double CoT = 0;
    private double totals = 0;
    private double projection = 0;
    private double min = 0;
    private double max = 0;

    Annual_Fuel_Use(int fillTemp, int daysTemp, int startTemp, int stopTemp, double gallTemp, double priceTemp){
        int fillNumber = fillTemp;                                       
        int daysSinceLastFill = daysTemp;                                       
        int startMiles = starttemp;                                     
        int stopMiles = stoptemp;                                       
        int distance = Annual_FuelUse.travelDistance(startMiles, stopMiles);
        double fuelConsumed = galltemp;
        double mPG = AnnualFuelUse.milesPerGal(dist, fuelConsumed);
        double pricePerGallon = pricetemp;
        double tripCost = AnnualFuelUse.costOfTrip(pricePerGallon, fuelConsumed);
    }

    public double getMilesPerGal(){
        return MpG;        
    }

    public int getTravelDistance(){
        return dist;        
    }

    public double getCostOfTrip(){
        return CoT;        
    }

    public double getTotals(){
        return totals;
    }

    public double getProjection(){
        return projection;
    }



    public int travelDistance(int distance1, int distance2){   
        dist = distance2 - distance1;
        return dist;
    }

    public double milesPerGal(int travelDistance, double fuelConsumed){        
        MpG = travelDistance / fuelConsumed;
        return MpG;
    }

    public double costOfTrip(double pricePerGal, double fuelConsumed){        
    CoT = pricePerGal * fuelConsumed;
        return CoT;
    }

    public double totals(double dat1, double dat2, double dat3){
        totals = dat1 + dat2 + dat3;
        return totals;
    }

    public double projection(int days,double projected){
        projection = (projected / days) * 365;
        return projection;
    }

    public double dataMin(int dat1, int dat2, int dat3){
        if (dat1 <= dat2){
            min = dat1;
        }
        if (min <= dat3){
            return min;
        } else {
            return dat3;
        }
    }

    public double dataMax(int dat1, int dat2, int dat3){
        if (dat1 >= dat2){
            max = dat1;
        }
        if (max >= dat3){
            return max;
        } else {
            return dat3;
        }
    }
}
4

3 回答 3

2

我刚刚注意到您错误地使用了static字段。您应该避免在构造函数中设置静态字段,因为这会导致混乱的噩梦。

我建议你

  • 使您的所有字段都非静态,以及使用它们的任何方法都是非静态的。如果您不这样做,您的所有对象实际上都在使用相同的字段,而不是它们自己的字段。
  • 让你的吸气剂匹配你的字段名称。尽量保持一致性,否则也会导致混乱。例如,如果您也travelDistance使字段名称相同。如果你想清楚说明 getter 方法getTravelDistance
  • 不要设置很多变量然后丢弃。只保留有用的代码,这也会令人困惑。
  • 不要在类名中使用下划线。

一般来说,您需要保持一致性,例如,您的 min/max 方法一半是使用数学实现的,一半是您自己的代码。

我建议您在继续之前修复所有代码。

于 2012-12-14T14:49:05.170 回答
1

首先,我看不到和distance变量,但我确实看到dist了,这也是私有的。

为您的字段创建吸气剂

 public int getDist(){
   return dist;
 }

然后在你的Annual_Fuel_Tester课堂上使用 then

int temp = FILL_1.getDist();
于 2012-12-14T15:20:49.557 回答
1

您的 Java (bean) 类的设计存在一些基本缺陷,正如您所见,这会导致使用它时出现问题。

  • 最直接的问题是范围/可见性之一。您的类变量被声明为私有的,这意味着它们在类本身之外是不可见的。为了以您现在的方式使用它们(在 main 方法中),您需要将它们设为公共或包私有。但是不要!见下点。

  • 您将类变量设为私有是正确的,这是由于封装的原则。一个对象应该尽可能多地隐藏它的内部实现,同时提供一个一致的接口来与之交互。您缺少的是调用者可以用来操作对象的内部状态的 getter/setter。把它们加进去!

  • 您的类变量就是这样 - 类变量!这是因为您已将它们设为静态。这意味着您班级的所有实例都将共享相同的值 - 我很确定这不是您想要的。通过删除这些字段上的 static 关键字来解决此问题。还要从所有类方法中删除 static 关键字。

  • 最后,您没有使用好的Java Naming Conventions。这样做可以使您的代码对您自己和其他人都更具可读性。相信我,如果您遵循这些约定,您将能够比不遵守这些约定更快地识别、诊断和修复错误。

您的 Java (bean) 类应如下所示:

public class AnnualFuelUse {
    private int dist = 0;
    private double MpG = 0;
    private double CoT = 0;
    private double totals = 0;
    private double projection = 0;

    // Constructors

    // Non-static getters/setters

    // Other methods
}

你的调用类应该是这样的:

public class AnnualFuelTester {   
    public static void main(String [] args) {
        AnnualFuelUse fill1 = new AnnualFuelUse(1, 1,  45023, 45231, 10.00, 2.95);
        int temp = fill1.getDistance();
    }
}

这应该让您朝着正确的方向开始。

于 2012-12-14T15:57:31.407 回答