用Java获取和设置方法。他们是如何工作的?

时间:2012-04-01 21:56:40

标签: java oop

我试图获得比迄今为止更好的理解......这是为了帮助我上课,但没有任何具体的家庭作业;我正在寻找更多我在教科书或教程中找不到的概念信息。在纯粹的理论层面上,我知道为什么封装对OO编程很有用,但需要更好地理解具体的内容。我一直在混淆数据流动的路径,并想知道我们在哪里获取和设置数据。希望这不是“没有愚蠢问题”规则的例外。

考虑:

 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);
     }
 }

使用此类,我不需要显式set变量,因为声明new Employee(123456789)会自动将该值发送到set...方法。 Employee方法中的return将结果值返回给调用方法,并使该变量可用,在本例中为对话框输出。我能掌握它吗?

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

我很想听听一些关于我是否正确理解正在发生的事情的想法。

5 个答案:

答案 0 :(得分:2)

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

在此示例中,使用setter还允许我们将age变量转换为生成的属性。由于年龄可以使用birthdate直接确定,因此您可以为age创建一个getter,并让它直接计算并返回年龄,而无需将其存储在任何位置。

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

答案 1 :(得分:2)

这取决于您使用Employee对象的方式。如果在施工时,您始终提供员工编号,或者自动提供一个员工编号,而员工编号从未在其他任何地方设置,那么您将不需要设置方法。

但是,如果在某个时候您要将员工编号设置为其他内容(可能是出错并且需要更新该编号),那么您将需要使用“设置”方法。在这种情况下,最简单的方法是从构造函数中调用“set”方法。

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

答案 2 :(得分:2)

首先,该网站将更多地用于可以得到具体回答的问题;与理论问题无关。

无论如何,第一部分有'get'和'set',你理解得很好。现在,当你说你不需要明确设置员工编号,因为你做“新员工......”并不完全正确。如果您明确定义了一个构造函数,它接受一个参数的整数,然后将'empNum'设置为等于争论的整数值,那么这将有效。

Getters和setter通常与'private'修饰符一起使用。 Setter可用于控制输入。例如,您可以检查提供的值是否大于零,如果您提供直接访问权限,则无法检查。 Getters只允许检索值,但是为了进行更改,您强制使用相应的setter(如果有的话)。

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

答案 3 :(得分:1)

你说

  

使用这个类,我不需要显式设置变量,因为声明新的Employee(123456789)会自动将该值发送到set ...方法。

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

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

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

现在更有意义的是getEmpNum()知道返回哪个值。

答案 4 :(得分: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;   
  }
}