2012-04-01 34 views
1

我试图得到比迄今为止能够更好的理解......它是为了帮助我上课,但没有完成任何特定的家庭作业;我正在寻找更多的概念信息,这些信息在我的教科书或教程中找不到。在纯粹的理论层面上,我明白了为什么封装对面向对象编程来说是强大的,但需要更好地理解什么,特别是正在发生。我一直在困惑自己关于数据流的路径,并且想知道我们从哪里获取数据和设置数据。希望这不是“没有愚蠢问题”规则的例外。在Java中获取和设置方法。他们如何工作?

考虑:

public class Employee 
{ 
    private int empNum; 
    public int getEmpNum() 
    { return empNum; } 
    public void setEmpNum(int Emp) 
    { empNum = emp; } 
} 

我的这种解释:使用int Emp从某处过去了,我们在set...方法设置的声明empNum变量。然后,我们get...该变量并将其返回给调用方法。这是一个很好的理解?

进一步考虑:

import.javax.* 
public class CreateEmp 
{ 
    public static void main(String[] args) 
    { 
     int ssn; 
     ssn = JOptionPane.showInputDialog(null,"enter ssn"); 
     Employee newEmp = new Employee(123456789); 
     JOptionPane.showMessageDialog(null,"Employee ID " + newEmp.getEmpNum); 
    } 
} 

有了这个类,因为在声明new Employee(123456789)自动地发送该值到set...方法我并不需要显式set一个变量。 Employee方法中的return将结果值返回给调用方法,并使该变量可用,在本例中为我的对话框输出。我有处理吗?

这里是我困惑的地方。根据我上面提到的理解 - 这可能是关闭的 - 我永远不能决定放置逻辑的最佳位置。例如:我会在Employee类中放置“输入员工编号”对话框,只有传递给方法的参数为null时才会运行条件。在我看来,就我所了解的数据流而言,课程的目的是获得一个员工编号。如果没有提供默认值,则需要创建一个。我不确定这个想法是否是最佳实践,或者如果我以后为自己设置了麻烦。

我很想听听关于我是否正确理解发生了什么的一些想法。

+2

UI不应该在Employee类中,因为员工不在乎它如何获取信息,也不应该这样做。 Java中几乎没有什么是“自动的”:构造函数参数值被设置为实例值的唯一方法是如果实例值是构造函数设置它的值:您的示例除了缺省构造函数以外什么也没有,因此尝试使用a实例化具有参数的ctor将无法编译。 – 2012-04-01 22:06:56

+0

我认为这是我感到有点困惑的地方,可能是因为我一直是程序编程人员,直到现在。 get-set组合与UI不同,在我看来,UI创建一个值,将其发送到get-set,然后将其返回到UI。为什么不跳过get-set并使用UI中的值?我知道它与抽象有关,但我们创建的简单骰子,卡片和员工程序可能仅仅是太简陋而无法为我制作这种凝胶。 – dwwilson66 2012-04-02 00:09:05

回答

2

首先,这个网站是能够具体地回答问题,使用较多;没有太多的理论问题。

总之,第一部分'get'和'set'你很好理解。现在当你说你不需要明确设置员工编号时,因为你确实“新员工......”并不完全正确。如果你明确定义了一个构造函数,它会为一个参数提供一个整数,然后将'empNum'设置为等于所说的整数值。

吸气剂和吸入器通常与“私人”修饰剂一起使用。 Setter可以用来控制输入。例如,您可以检查提供的值是否大于零,如果您直接访问,则不能。 Getters只允许检索值,但要进行更改则需强制使用相应的setter(如果有)。

如果没有提供某个值,您应该如何设置默认值。考虑你检索的值(如果有的话)将被用在不同的类中。如果用户从未设置值,该怎么办?如果这不是你所期望的呢?不同的阶级,不管它是什么,仍然需要一个价值,你仍然需要传递一些东西。通过设置默认值,不同课程可以识别出“哦,这是一个默认值 - 这意味着用户可能没有提供正确的输入。”通过这样做,您可以创建一个相对安全的应用程序;即使输入不是预期的,你仍然可以继续工作。

2

为私有变量使用公共访问器的目的是控制如何访问这些变量并确保所有内部状态保持一致。例如,一个类可能同时有一个age和一个birthdate变量。设置birthdate也隐式设置年龄。如果直接访问这些变量,则可以将它们设置为不一致的值(即,生日表示他们是30,但年龄设置为35)。通过使用setter,我们可以确保设置出生日期将重置年龄是正确的。

在这个例子中,使用setter也可以让我们将age变量转换成一个生成的属性。由于年龄可以使用birthdate直接确定,因此您可以为age创建一个获取者并让它直接计算并返回年龄,而不需要将其存储在任何地方。

如果我们使用getter和setter来公开这些对象属性,我们可以自由地切换实现(例如,移除age变量并在运行中计算它),而不需要我们的对象的用户担心它。

+0

作为一个快速跟进,您不必为所有变量声明getter和setter。正如@JHenderson在他的回答中提到的,如果你有一个不应该被重置的变量,那么不要声明一个setter,因为你不想让其他类改变它。 – 2012-04-01 22:09:02

2

这取决于您如何使用Employee对象。如果在施工时,您始终提供员工编号或自动提供的员工编号,并且员工编号绝不会设置在其他地方,那么您将不需要设置方法。

但是,如果您在某些时候要将员工编号设置为其他值(可能是发生了错误并且需要更新编号),那么您需要使用“set”方法。在这种情况下,从构造函数中调用“set”方法可能最容易。

这实际上取决于如何使用/实例化Employee类。

1

你说

有了这个类,我并不需要明确设置变量,因为宣布新员工(123456789)自动地发送该值来设定的......方法。

我很确定这不是真的。考虑一下:Java创建一个Employee对象,构造函数接收值123456789。它如何知道需要分配该值的变量?它不知道。可能有多个属于该对象的变量,因此它不知道123456789的真正含义。

当您没有在Java中定义构造函数时,它会自动为您创建一个构造函数。但是那个没有任何参数,它只是一个默认的构造函数。你的代码有几个编译错误(例如,javax的导入行是错误的),所以我猜你正在运行一个以前编译过的代码版本。删除项目中的所有.class文件,修复编译错误并再次运行。它应该给你一个错误。它还会使数据流更容易理解。构造函数应该是这个样子:

 
public Employee(int empNum) { 
    this.empNum = empNum; 
} 

现在做很多更有意义的是getEmpNum()知道要返回的值。

1

有了这个类,我不需要显式设置一个变量,因为声明新的Employee(123456789)会自动将该值发送到set ...方法。 Employee方法中的返回值将结果值返回给调用方法,并使该变量可用,在本例中为我的对话框输出。我有处理吗?

你的理解在这里有点不对。声明

new Employee(123456789) 

通过使用构造函数方法创建新的Employee对象。构造函数通常使用参数来设置类的内部成员变量。 所以完整的Employee类是 -

public class Employee 
{ 
    private int empNum; 

    public Employee(int employeeNum) { 
    empNum = employeeNum; 
    } 
    public int getEmpNum() { 
    return empNum; 
    } 
    public void setEmpNum(int Emp) { 
    empNum = emp; 
    } 
}