繁体   English   中英

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

[英]How to use OOP, constructors, and objects to pass variables to methods and main method

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

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

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

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中是正确的。 表格会打印出距离,加仑等的计算值。

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

好的,我不确定分配是什么,因为它无法访问,但是我认为他们希望您创建一个具有在对象创建期间在构造函数中设置的字段的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:我认为是静态方法与实例方法使您感到困惑的原因,请尝试刷新本部分课程或使用其他来源(= google :)

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

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...
}

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM