如何使用OOP,构造函数和对象将变量传递给方法和主方法

时间:2019-01-31 17:17:10

标签: java oop object constructor

我有一个程序,可以在其中计算和打印油耗信息。我正在处理的分配要求我(好吧,我认为它想让我)使用OOP,构造函数和对象将变量从构造函数传递到整个程序。对我来说根本没有意义。

以下是确切的作业说明: https://drive.google.com/file/d/1D1FZKHrU4duu1UyWusPvsjVum33B8kdt/view?usp=sharing

我尝试将主方法中的原始变量设为私有静态变量,并将其放在类标题的正下方。这可行,但是我认为指令希望我的构造函数以某种方式包含变量。这对我根本没有任何意义。我没有任何构造函数或对象以及如何在此应用程序中使用它们,这让我很沮丧。

CarV3,该程序的指令参考了我应该面向对象的内容,如下所示:

public class CarV3 {
    public static int calcDistance(int sMiles1, int eMiles1){
        return eMiles1 - sMiles1;
    }

    public static double calcMPG(int dist1, double gals1){
        return dist1 / gals1;
    }

    public static void main(String[]Args) {
        int sMiles1 = 43305;
        int eMiles1 = 43422;
        int dist1;
        double gals1 = 7.8;
        double MPG1;
        String carType1 = "14 Acura MDX";

        CarV3 car1 = new CarV3();

        dist1 = car1.calcDistance(sMiles1, eMiles1);
        MPG1 = car1.calcMPG(dist1, gals1);

        System.out.printf("%52s%n%s%16s%14s%13s%12s%14s%n%s%n", "Gas Mileage Calculations", "Type of Car", "Start Miles", "End Miles", "Distance", "Gallons", "Miles/Gal",
"================================================================================");
        System.out.printf("%s%15d%14d%13d%12.1f%14.1f", carType1, sMiles1, 
        eMiles1, dist1, gals1, MPG1);
    }
}

该代码以前有效。 指令要求稍后计算GPM和其他数据,因此我的程序在CarV5中变成了类似这样的内容:

public class CarV5 {
    private static int sMiles1 = 43266;
    private static int eMiles1 = 43422;
    private static int dist1;
    private static double gals1 = 7.8;
    private static double MPG1;
    private static double pricePerGallon1 = 2.98;
    private static double GPM1;
    private static double totalCost1;
    private static String carType1 = "14 Acura MDX";

    CarV5() {
    }

    public int calcDistance(int sMiles1, int eMiles1){
        return eMiles1 - sMiles1;
    }

    public static double calcMPG(int dist1, double gals1){
        return dist1 / gals1;
    }

    public static double calcGPM(int dist1, double gals1) {
        return gals1 / dist1;
    }

    public static double totalCost(double pricePerGallon1, double gals) {
        return pricePerGallon1 * gals;
    }

    public static void main(String[]Args) {
        CarV5 car1 = new CarV5();

        dist1 = car1.calcDistance(sMiles1, eMiles1);
        MPG1 = car1.calcMPG(dist1, gals1);
        GPM1 = car1.calcGPM(dist1, gals1);
        totalCost1 = car1.totalCost(pricePerGallon1, gals1);

        System.out.printf("%70s%n%s%16s%14s%13s%12s%10s%9s%14s%13s%n%s%n", "Gas Mileage Calculations", "Type of Car", "Start Miles", "End Miles", "Distance", "Gallons", "Price", "Cost", "Miles/Gal", "Gal/Mile", "================================================================================================================");
        System.out.printf("%s%15d%14d%13d%12.1f%10.2f%9.2f%14.1f%13.3f", carType1, sMiles1, eMiles1, dist1, gals1, pricePerGallon1, totalCost1, MPG1, GPM1);
    }
}

尽管此代码有效,但我几乎肯定这不是指令要求我执行的操作。老实说,我不明白指示要我做什么。您在此处看到的程序确实会打印出预期结果,即所有汽车数据。但是,在说明中,我被告知要使用某种带有值的构造函数。如果您在第二个版本中注意到我有这个“ CarV5(){}”,那么我对它的功能不了解。

如前所述,预期输出在我的第二版程序CarV5中是正确的。表格会打印出距离,加仑等的计算值。

我的方法出了什么问题。 对于冗长的帖子,我感到抱歉,但是也参加本课程的朋友们认为我已经超出了授课的目的,如果我说实话,也许我也是。我真的很想弄清楚该怎么做。

3 个答案:

答案 0 :(得分:0)

好吧,我不确定分配是什么,因为它不可访问,但是我认为他们希望您创建一个带有将在对象创建期间在构造函数中设置的字段的Class。让我举一个简单的例子:

package tst;

public class CarTest {

    public static void main(String[] args) {
        // creating new instance of the Car and at once setting all its fields in constructor
        // now as I see the assignment, this line corresponds to 
        // CarV5 car1 = new CarV5(carType1, endMiles1, startMiles1, gallonsUsed1, pricePerGallon1);
        Car car = new Car(43266, 43422, 7.8);

        //calculating and printing the result w/o providing values but using instance fields
        System.out.println(car.calcDistance());

    }




    // the Car class itself, you can put it in different file
    public static class Car {

        // note that fields are NOT static, i.e. they belong to an INSTANCE of the class, not the class itself
        private int sMiles1;
        private int eMiles1;
        private double gals1;

        //
        public Car(int sMiles1, int eMiles1, double gals1) {
            this.sMiles1 = sMiles1;
            this.eMiles1 = eMiles1;
            this.gals1 = gals1;
        }

        // example of your methods
        public int calcDistance(){
            return this.eMiles1 - this.sMiles1;
        }

        // other methods you need

    }

}

让我知道是否有帮助:) PS:我认为让您感到困惑的是 static instance 方法,请尝试刷新本部分课程或使用其他来源(= google :))

答案 1 :(得分:0)

首先,为什么一切都是静态的? 其次,由于您的链接不起作用,我无法真正看到要求执行的操作,因此我只能根据您的说法,假设您要使用构造函数创建对象, ?

public class CarV5 {

private int sMiles1;
private int eMiles1;

public CarV5(int sMiles1Constructor,int eMiles1Constructor){
   this.sMiles1 = sMiles1Constructor;
   this.eMiles1 = eMiles1Constructor;
}

 your methods...

}

public static void main(String[]Args) {
    CarV5 car1 = new CarV5(43266,42422);

     //Call your methods here...
}

基本上,您只需要在构造函数中将变量作为参数传递即可。

别放弃男人,一旦您学习了这些基础知识,随着时间的推移它会变得越来越容易,不用担心。

答案 2 :(得分:0)

对象是与其他任何类型一样的数据类型(例如int,double,String等),这意味着您可以使用不同的名称和关联的属性创建多个这些对象。字段变量 (最常见的形式为
private int field_name; ) 只是此Object值的一部分。您必须从字面上看:将每加仑英里数属性直接与您所读过的任何汽车相关联,因此工作原理相同。静态变量是一种使值扩展类的较小范围的简单方法,方法是让不属于类的对象访问变量(当然仅属于该特定类),这些变量不属于特定于汽车的对象(例如,年份变量,对于所有对象都是相同的(无关,但可能的例子))。希望这可以清除一切!