理解java中的类和变量

时间:2014-01-24 17:07:33

标签: java oop

我是Java的新手,这是我在我正在阅读的书中找到的一个例子。在这段代码中有几件我不理解的事情。请帮助我理解它。

/*
 * CalculatorModel
 * Encapsilates the data model used by the calculator Application
 */

public class CalculatorModel{
    private double operand1;
    private double operand2;

    public void setOperand1(double value){
        operand1=value;
    }

    public void setOperand2(double value){
        operand2=value;
    }

    public double getOperand1(){
        return operand1;
    }

    public double getOperand2(){
        return operand2;
    }

    public String toString(){
        String s = "operand 1=" + operand1 + "operand 2=" + operand2;
        return s;
    }
}

/*
 * CalculatorHelper
 * A class that performs mathematical functions for a calculator program
 */
public class CalculatorHelper{
    private CalculatorModel calcModel;

    public CalculatorHelper(){
        calcModel=new CalculatorModel();    
    }

    public void setOperand1(double value){
        calcModel.setOperand1(value);
    }

    public void setOperand2(double value){
        calcModel.setOperand2(value);
    }

    public double add(){
        return calcModel.getOperand1()+calcModel.getOperand2();
    }

    public double subtract(){
        return calcModel.getOperand1()-calcModel.getOperand2();
    }

    public double multiply(){
        return calcModel.getOperand1()*calcModel.getOperand2();
    }

    public double divide(){
        return calcModel.getOperand1()/calcModel.getOperand2();
    }
} 

请帮助我了解

所做的工作
private CalculatorModel calcModel;

    public CalculatorHelper(){
        calcModel=new CalculatorModel();    
    }  

calculatorHelper课程中。 calcModel变量是CalculatorModel类型的变量吗?将对象作为数据类型而不是基本数据类型与变量有什么区别? 如果calcModel是一个变量,那么行 calcModel = new CalculatorModel();

我不明白为什么有两个类CalculatorModelCalculatorHelper很重要。

该方法做了什么

public void setOperand1(double value){
    calcModel.setOperand1(value);
}  
辅助类中的

因为setmethod类中已经有CalculatorModel

这是我尝试过的,这段代码有什么问题?

public class Calculator{
    private double num1,num2;
    public void setValue1(double value1){
        num1=value1;    
    }

    public void setValue2(double value2){
        num2=value2;    
    }

    public double getValue1(){
        return num1;
    }

    public double getValue2(){
        return num2;
    }

    public double add(){
        return getValue1()+getValue2();
    }

    public double subtract(){
        return getValue1()-getValue2();
    }

    public double multiply(){
        return getValue1()*getValue2();
    }

    public double divide(){
        return getValue1()/getValue2();
    }
}

5 个答案:

答案 0 :(得分:3)

  

“将对象作为数据类型而不是基本数据类型与变量有什么区别?”

编程就是数据。您可以将类视为复杂数据,将基元视为简单数据。假设你有一个班级School

public class School {
}

学校有什么?它有学生。您不能代表具有原始类型的学生,因为对于学生而言doubleint boolean等等是没有意义的。所以学生是另一种复杂的数据类型,如学校。因此,为了让学生被表示为学校所包含的数据,您还需要一个Student课程,该课程可以保存学生的姓名,地址等。

public class Student{
   String firstName;
   String lastName;
   String address;
   int age;

因此,为了完全代表学生在学校,您使用 has-a 关系,其中School 有一个 Student < / p>

public class School {
    Student student;
}

为了更深入地研究,学校是否只有一个学生?不,它应该有很多学生。因此,您可以将其表示为School,其数组为Students

public class School {
    Student[] students;
}

所以就数据而言,你现在有一个像这样的数据树

School
     Student
           firstName
           lastName
           address
           age
     Student
           firstName
           lastName
           address
           age

这是面向对象编程背后的基本思想。当您将对象视为实际物理对象时,理解起来要容易得多。它使人们更容易理解这些关系。

答案 1 :(得分:2)

  1. 是的,您假设calcModel是CalculatorModel类型的变量对象是正确的。当你说calcModel = new CalcModel();它实际上是在内存中创建另一个对象来存储要存储的数据(两个操作数)并在calcModel中存储该对象的地址。这样您就可以引用之前创建的对象。如果您之前使用过c,则可以很容易地说calcModel是一个指针,其中创建的对象是位于指针中的地址中的数据。

  2. 基本类型变量和对象类型变量之间的区别在于,要存储在变量中的实际数据要复杂得多。例如,类CalculatorModel是两个双精度的组合......您可以将两个操作数作为一个实体进行组合(封装)在一个类中。对象还可以包含可以对存储在其成员变量中的数据执行某些操作的方法。

  3. 没有必要有两个班级,有些人喜欢这样。我确信在这种情况下不需要创建两个类。两者都可以合并,就像你明显做的那样。请注意,没有正确和错误的编码方式,更有利于某些方法,因为它们更受欢迎,从长远来看避免了可读性问题。 setOperand1()方法只是使用calcModel.setOperand1()所以我认为没有必要这样做,calcModel.setOperand1可以从调用setOperand1()的地方直接调用。但是,在调用calcModel.setOperand1之前,可能存在要隐藏setOperand1的哪个函数或要执行某些复杂操作的情况。在这种情况下,您希望通过创建的setOperand1()减少calcModel.setOperand1的调用者的负担。

  4. 代码没有问题。但是,您不必使用getValue1()&amp; getValue2()函数在你的加法,减法和其他数学运算中。你可以简单地说return num1+num2因为,num1&amp; num2是同一类的成员变量。

答案 2 :(得分:0)

private CalculatorModel calcModel;

    public CalculatorHelper(){
    calcModel=new CalculatorModel();    
    }  
  

在calculatorHelper类中。 calcModel是变量的变量吗?   类型CalculatorModel?将对象作为一个有什么区别   数据类型比原始数据类型变量?如果calcModel是   变量由calcModel = new CalculatorModel();

行完成的操作

变量calcModelCalculatorModel 实例 ,但是类CalculatorHelper的类变量。如果您想了解原始数据类型与对象数据类型check this article out。此行calcModel=new CalculatorModel(); 初始化 变量。您必须这样做才能实际使用这些方法。 Read more here.

  

我不明白为什么有两个班的重要性   CalculatorModel和CalculatorHelper。

在分离大块逻辑时,有些辅助类/方法很有用。 Check this article out.

public void setOperand1(double value){
        calcModel.setOperand1(value);
    }  
  帮助器类中的

因为在CalculatorModel中已有一个setmethod   类。

是的,并且它从CalculatorHelper类调用相同的set方法。

  

这是我尝试过的,这段代码有什么问题?

代码似乎没有任何问题。我假设您正在使用main方法(或者您正在使用该类的任何方法)。

答案 3 :(得分:0)

这实际上是一个委托模式,作者通过该模式实现了Calculator。 计算器提供现实生活计算器的抽象。

通过提供helper / delegate类,我将对象的行为分开。我可以使用帮助程序类自由编写自己的add / subtract实现。 Calculator将作为您计算的模型。

考虑到这一点,如果您尝试修改行为,则需要更改整个Calculator类并将其分发给客户端。但是,我不必修改计算器,只需要修改客户端执行/可能不会发送的帮助程序。

你所做的事情没有错 - 但考虑一下 - 如果你想拥有计算器的单个实例 - 你可以使用助手类控制instantion(在这种情况下)

答案 4 :(得分:0)

private CalculatorModel calcModel;

    public CalculatorHelper(){
    calcModel=new CalculatorModel();    
    }  

是用于分离关注点的组合物。 CalculatorHelper关注的是知道如何进行加法,减法,...... CalculatorModel知道值,如何将它们提供给外部以及如何存储它们。

CalculatorHelper has therefore an instance of CalculatorModel`,它可以委托所有它不知道的东西。 E.g。

public void setOperand1(double value){
    calcModel.setOperand1(value);
}  

总体设计仍然值得怀疑。首先是它是一个“计算器”的错误封装,因为数学运算都没有以任何方式反映回模型。需要有第三个类(CalculatorHelperHelper?)知道如何处理两个以上的操作数。

CalculatorModel是否应该同时具有两个值也值得怀疑。两个单独的值对象将使IMO更有意义,并且会产生更多模块化代码,这些代码也更容易理解为对象的组合。

此示例中的最后一点是将值“存储”到CalculatorModel中并不会在此处提供任何实际好处。如果存在某种类型的数据库后端或其他不属于CalculatorHelper的“复杂”逻辑,则会出现这种情况。在简单的现实场景中,我会采取或多或少的方法。你的代码没错。这只是一种不同的方法。

本书上下文中的代码,并且假设它是一个展示一些设计技术的示例,可以用于此目的。如果我要写一个计算器,我会做的非常不同。另一方面,OO设计不对或错,人们可以争论好的设计是什么。