繁体   English   中英

需要一些帮助来理解教程代码:Java - Class Constructors / Initializers

[英]Need some assistance understanding tutorial code: Java - Class Constructors / Initializers

我一直在关注 Pluralsight 上的一些基本 Java 教程,我遇到了一个问题,我不太明白导师想要解释的内容,他似乎倾向于很快地复习一些练习,这是一个有点难以遵循。

我有 2 个类,一个“Main”和一个“MathExecution”。 我完全了解 MathExecution 中发生的事情,但是我不太了解 Main 的某些方面,我将对其进行介绍。 我将在下面粘贴两个类:

主.java:

public class Main {

    public static void main(String[] args) {

//        double[] value1 = {100.0d, 18.0d, 30.0d,  27.0d};
//        double[] value2 = {50.0d, 2.0d, 15.0d, 99.0d};
//        char[] opCodes = {'d', 'm', 's', 'a'};
//        double[] result = new double [opCodes.length];

        MathEquation[] equations = new MathEquation[4];
        equations[0] = create(100.00d, 50.0d, 'd');
        equations[1] = create(25.0d, 92.0d, 'a');
        equations[2] = create(225.0d, 17.0d, 's');
        equations[3] = create(11.0d, 3.0d, 'm');


        for (MathEquation equation: equations){
            equation.execute();
            System.out.print("Result: ");
            System.out.println(equation.getResult());
        }

    }

    public static MathEquation create(double value1, double value2, char opCode){
        MathEquation equation = new MathEquation();
        equation.setValue1(value1);
        equation.setValue2(value2);
        equation.setOpCode(opCode);

        return equation;
    }
}

MathExecution.java:

public class MathEquation {


    private double value2;
    private double value1;
    private char opCode;
    private double result;

    public double getValue1() {return value1;}
    public double getValue2() {return value2;}
    public double getOpCode() {return opCode;}
    public double getResult() {return result;}

    public void setValue1(double value1) {this.value1=value1;}
    public void setValue2(double value2) {this.value2=value2;}
    public void setOpCode(char opCode) {this.opCode=opCode;}






    public void execute(){

        switch (opCode){
            case 'd':
                result = value2 != 0.0d ? value1 / value2: 0.0;
                break;

            case 'm':
                result = value1 * value2;
                break;

            case 's':
                result = value1 - value2;
                break;

            case 'a':
                result = value1 + value2;
                break;

            default:
                System.out.println("Something Broke!");
                result = 0.00d;
                break;
        }

    }
}

我不太明白(我认为我无论如何都不明白)这里实际发生了什么:

 MathEquation[] equations = new MathEquation[4];

在查看它时,我假设我们正在创建 MathEquation 的一个新实例,调用是“equations”并指定我们将传递 4 个数组(我们稍后会这样做)。

我要跳过一点...

我不太明白这里发生了什么:

public static MathEquation create

我知道我正在声明一个方法(?),它是公共的,这意味着它可以从任何地方访问(?),我还不知道静态是什么意思。 它被称为“创建”,但我不知道 MathEquation 在此声明中的作用。

我明白这个方法的主体发生了什么,

MathEquation equation = new MathEquation();
equation.setValue1(value1);
equation.setValue2(value2);
equation.setOpCode(opCode);

return equation;

我们正在创建 MathEquation 的另一个实例并将其称为方程。 然后传递声明“create”时指定的参数。

我想我不明白 return 语句是如何完全工作的,为什么它返回整个类(方程)?

查看“for”循环。 我看到它使用了之前返回的“方程”,但我不明白这里的语法:

MathEquation equation: equations

我想我明白最后一行了..

System.out.println(equation.getResult());

我们只是打印 getResult ,它只是 MathExecution 类中的一个公共方法,它返回一个私有变量的值。

如果有人可以对正在发生的事情提供一些见解,我将不胜感激。 我重新观看了视频并尝试使用代码,但我似乎无法理解它是如何连接在一起的。

或者,如果您能在回到本示例之前向我指出我可能会获得更好理解的任何资源,那也将是完美的。

非常感谢您的阅读。

以下是我的回答:

  1. 数组创建

我不太明白(我认为我无论如何都不明白)这里实际发生了什么:

MathEquation[] equations = new MathEquation[4];

在查看它时,我假设我们正在创建 MathEquation 的新实例,

不,代码创建了一个包含四个引用的数组,并调用该数组equations 创建了一个对象(数组),其索引都设置为null

  1. 方法声明

我不太明白这里发生了什么:

public static MathEquation create

我知道我正在声明一个方法(?),它是公共的,这意味着它可以从任何地方访问(?),我还不知道静态是什么意思。

这是非常基础的,你应该再次阅读教程。 static意味着该方法(或字段)未附加到该类的任何实例。 相反,它对系统中的所有对象都是通用的(全局)。 MathEquation是该方法的返回类型:它返回一个MathEquation对象。

  1. 方法调用

这里的东西也是超基础的,就是调用一个方法而已。

MathEquation equation = new MathEquation();
equation.setValue1(value1);
equation.setValue2(value2);
equation.setOpCode(opCode);

return equation;

我们正在创建 MathEquation 的另一个实例并将其称为方程。 然后传递声明“create”时指定的参数。 我想我不明白 return 语句是如何完全工作的,为什么它返回整个类(方程)?

创建MathEquation另一个实例是正确的。 传递参数...好吧,它是,但更简单地说,它只是在刚刚创建的对象上调用方法。 当然,它使用的是在调用create时给出的参数。 return 语句只能选择返回“整个类”或原始类型(如intchar ),因此这是您唯一的选择。 实际上,它仅通过返回对整个对象的引用来返回“整个对象”。

  1. 对于每个

查看“for”循环。 我看到它使用了之前返回的“方程”,但我不明白这里的语法:

MathEquation equation : equations

这只是一个for-each循环,阅读文档: https : //docs.oracle.com/javase/1.5.0/docs/guide/language/foreach.html

  1. 打印的东西

我想我明白最后一行了..

System.out.println(equation.getResult());

我们只是打印 getResult ,它只是 MathExecution 类中的一个公共方法,它返回一个私有变量的值。

正确。

我将尝试用简单的语言来解释它。 如果您发现不认识或不理解的单词,请在Java 教程 中查找。


作为基础,我们将首先查看create方法。 第一行(签名)说的是,你有一个可以从任何地方( public )调用的方法,不需要一个实例来调用它( static ,我认为你应该查一下定义,我不能现在想出一个简单的解释),返回一个MathEquation ,称为create ,并且需要三个parameters作为输入来创建该返回值。

public static MathEquation create(double value1, double value2, char opCode)

然后该方法继续:

    // take the MathEquation class and create an instance by using the constructor
    MathEquation equation = new MathEquation();

    // give the equation the necessary values it needs to be executed later
    equation.setValue1(value1);
    equation.setValue2(value2);
    equation.setOpCode(opCode);

    // return that equation to the caller of the method for them to use
    return equation;
}

好的,那么 main 方法中发生了什么?

首先,我们创建一个数组(它是一种列表),其中有 4 个MathEquation的空间,称为equations 此刻是空的!

    MathEquation[] equations = new MathEquation[4];

这就是为什么我们必须在这里填写它。 我们使用上面的create方法获取MathEquation 4 个实例并将它们放入数组的空槽 (0-3) 中。

    equations[0] = create(100.00d, 50.0d, 'd');
    equations[1] = create(25.0d, 92.0d, 'a');
    equations[2] = create(225.0d, 17.0d, 's');
    equations[3] = create(11.0d, 3.0d, 'm');

然后我们取出数组,使用for循环查看其中的每个方程,然后做一些事情。 for循环如下:“对于方程中的每个方程”

    for (MathEquation equation: equations) {

对于方程,我们要求它自行求解。 这会将结果存储在等式对象中。 然后我们为该结果获取等式并将其打印到控制台。

        equation.execute();
        System.out.print("Result: ");
        System.out.println(equation.getResult());

在查看它时,我假设我们正在创建 MathEquation 的一个新实例,调用是“equations”并指定我们将传递 4 个数组(我们稍后会这样做)。

不,您实际上是在创建一个包含 4 个项目的数组。 它不会创建MathEquation任何实例(或数组中的任何项目)——您只需创建数组。

这样想:假设我在酒店预订一个团体。 我打电话给酒店,告诉他们将有 4 个家庭进来。经理“预留”了 4 个彼此相邻的房间。 显然,经理“搁置”4 个房间实际上并没有创建房间或家庭,也不会导致家庭神奇地出现在房间中。 它只是说,一旦这些家庭到达,经理打算将他们安置在那里。

家庭彼此相邻这一事实的一个有趣特征是:如果您知道第一个家庭在哪个房间,您就可以立即计算出其他家庭也将在哪个房间。 例如,如果家庭 1 在 100 房间,那么显然家庭 2 必须在 101 房间,家庭 3 必须在 102 房间,家庭 4 必须在 103 房间。

现在,这里有一个static类比 - 假设连锁酒店有一个允许您进行预订的网站。 该网站与整个连锁酒店相关联,不仅仅是个别酒店。 这就是static作用 - 它与类相关联(以此类推,整个连锁酒店),而不仅仅是那个特定的对象(或酒店)。

暂无
暂无

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

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