【问题标题】:Need some assistance understanding tutorial code: Java - Class Constructors / Initializers需要一些帮助来理解教程代码:Java - Class Constructors / Initializers
【发布时间】:2018-01-08 21:08:36
【问题描述】:

我一直在关注 Pluralsight 上的一些基本 Java 教程,但我有点不太明白导师试图解释什么,他似乎倾向于快速完成一些练习而且有点难以理解。

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

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 实例,调用的是“方程式”并指定我们将传递 4 个数组(我们稍后会这样做)。

我要略过...

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

public static MathEquation create

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

认为我了解这个方法的主体中发生了什么,

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

return equation;

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

我不认为我完全理解 return 语句是如何工作的,为什么它会返回整个类(等式)?

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

MathEquation equation: equations

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

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

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

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

或者,如果你能在回到这个例子之前指出我可能获得更好理解的任何资源,那也是完美的。

非常感谢您的阅读。

【问题讨论】:

  • 我会看看我是否可以回答你的一些问题,但如果你有这种问题,你真的应该从更基本的东西开始。试试官方Java Tutorials。您正在混淆非常基本的术语和语法(这在您刚刚开始时是可以理解的),因此很难从此类示例开始。
  • docs.oracle.com/javase/tutorial 从顶部开始,逐步完成
  • 太多问题集中在一处 - 你会被否决。如果您一次查看每一行中的代码,您会得到一些澄清。 static 意味着您可以在不实例化类的情况下访问该成员。 create 是一种工厂模式方法,用于创建方程式的实例 - 您需要返回对该方程式的引用,以便稍后您可以调用它的 execute 方法。
  • Jason 的观点可能很好。如果您分别发布这些问题,您可能还会发现大多数问题都是重复的。也就是说,您可以通过在 Google 中输入术语并搜索结果来找到答案。首先搜索答案是基本的,使用几个不同的搜索词,任何软件工程师都应该首先尝试。

标签: java class methods


【解决方案1】:

这是我的答案:

  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 实例并将其命名为 equation。然后传递声明“create”时指定的参数。我不认为我完全理解 return 语句是如何工作的,为什么它会返回整个类(方程)?

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

  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 类中的一个公共方法,它返回一个私有变量的值。

正确。

【讨论】:

    【解决方案2】:

    我会尽量用简单的语言来解释。如果您发现不认识或不理解的单词,请在Java Tutorials 中查找。


    作为基础,我们先来看create方法。第一行(签名)说的是你有一个可以从任何地方调用的方法(public),不需要实例来调用它(static,我认为你应该查找@987654322 @,我现在想不出一个简单的解释),返回一个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 个MathEquations 的空间,称为equations。目前是空的!

        MathEquation[] equations = new MathEquation[4];
    

    这就是为什么我们必须在这里填写它。我们使用上面的create 方法获取MathEquation 的4 个instances,并将它们放入我们数组的空槽(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 each equation in equations”

        for (MathEquation equation: equations) {
    

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

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

    【讨论】:

      【解决方案3】:

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

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2018-01-27
        • 1970-01-01
        • 2012-02-17
        • 1970-01-01
        • 1970-01-01
        • 2023-04-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多