Java中的getter和setter

时间:2013-04-12 14:50:42

标签: java get set

我是Java的新手,我正在尝试理解一些概念。我一直在读几本书,但我一直在同一个地方难倒。请查看以下代码:

package Grade;
import static java.lang.System.out;
import java.util.*;

public class GradeBook {

private String courseName;

public void setCourseName (String name) {
    courseName = name;

}
public String getCourseName() {
    return courseName;
}

public void Display() // needs a string to run
{
out.println("Welcome to:" + getCourseName() );  
}
}

我不确定为什么setCourseName()需要(字符串名称),或者甚至从哪里获取该值。如果有人试图以外行的方式解释这一点,我们将不胜感激。

7 个答案:

答案 0 :(得分:5)

成绩册的故事

GradeBook 有一个秘密。它是名为 courseName private成员变量。

enter image description here

成绩簿:除了我,没有人接触过这个变量!

敲门,敲门。这是教师类。

老师:嘿,我发现你是一本 GradeBook 课程,让我为你指定今天的课程。我想你有一个courseName变量?

成绩簿:不,我没有! (

思考...嗯,我怎么能保守我的秘密,但还是让她给我这个课程名称?我非常需要。

成绩簿:好的,你几乎让我在那里。我不会告诉你我是否有courseName变量,这太个人了。但是你可以在方法setCourseName中写下课程。这样可以吗?我会从那里处理它。 :)

实际上...

没有人强迫你写 setCourseName 。你的程序运行得很好。您可以选择创建courseName public

public String courseName;

但这是一个很大的但是这等于把你的日记放在草坪上,让你的邻居或任何一个路人都能用它。你不会这样做吗?

封装,用外行的话说。

答案 1 :(得分:4)

欢迎使用面向对象的编程。您的成员变量courseName是私有的,无法从外部访问。

要提供对courseName变量的读访问权,请提供getter方法:

public String getCourseName() { ... }

要提供对courseName的写访问权限,请提供setter方法:

public void setCourseName (String name) { ... }

此名称作为参数传递给setter方法,该方法用于将值设置为私有变量courseName

答案 2 :(得分:2)

您需要为此类使用getter和setter方法,因为courseName字段是私有的;类外的代码无法直接访问该字段。使用该类的其他代码(通常称为客户端代码)将提供传递给setCourseName的参数值,并使用getCourseName返回的值。

通过这个简单的例子,很难理解为什么这个类会以这种方式设计。可以轻松地使courseName成为公共字段,并让客户端代码直接操作它。但是,随着类变得更复杂,使用get / set样式提供了许多优点。以下是一些:

  • 使用getter / setter方法有助于将客户端代码与实现类的更改隔离开来。例如,您可能稍后决定课程名称具有某种内部结构,并且您希望将名称的各个部分保留在单独的字段中。您只需更改setCourseNamegetCourseName的实施方式,就不需要更新客户端代码。

  • 自动化软件生成工具依赖于属性getter和setter的存在。使用这些工具,您可以简单地将您的类建模为具有“courseName”属性,并且它将生成使用适当方法的代码。

  • 您可能稍后决定更改课程名称应该具有某些副作用(例如在某处更新课程目录)。可以通过修改setCourseName方法来实现这些依赖关系。

通常使用面向对象的编程,默认设计应该是尽可能地隐藏类实现并仅通过方法公开类。有时候有充分理由违反这一原则,但坚持这一原则往往会产生更强大的软件。

答案 3 :(得分:1)

此类本身从不使用setCourseName,但从理论上讲,它可用于更改私有变量courseName

答案 4 :(得分:1)

请阅读encapsulationdata abstraction。在该程序的某个地方,某人正在实例化GradeBook类,然后setting其成员变量。样本将是:

package Grade;  
import static java.lang.System.out;
import java.util.*;

class GradeBook {

    private String courseName;

    public void setCourseName (String name) {
       courseName = name;

    }
    public String getCourseName() {
      return courseName;
    }

   public void display()
   {
      out.println("Welcome to:" + getCourseName() );  
   }
}

public class Main {
  public static void main(String[] s) {
   // creating instance of GradeBook class
   GradeBook gb = new GradeBook(); 
   // assigning value to the instance variable 'courseName' using setter 
   // as it a private member and cannot be accessed outside the class definition.
   gb.setCourseName("java");
   // calls a public method to display the value.
   gb.display();
}

答案 5 :(得分:1)

原因是您无法从类外部访问私有属性(courseName)。 get和set方法分别用于访问(获取)和更改(设置)其值。

答案 6 :(得分:1)

我最初发表评论。但我决定发表一个答案,因为我相信很多人都在误解这个问题。

看起来你实际上是在询问parameters以及它们的用途,而不是关于getter,setter和封装。

我做了一些搜索并遇到了这个链接: http://www.homeandlearn.co.uk/java/java_method_parameters.html

这是Java的初学者指南,专门解释了Java中的参数。

您用Java编写的methods有时需要值才能完成任务。您可能不希望您的方法拥有这些变量或继承这些变量,很多时候您只想给方法一个变量,这样它就可以暂时将它用于快速任务或进程然后返回一个值。这是您在方法定义中看到的String name,它是一个参数,一个传递给方法的变量。您可以将任意数量的变量传递给方法。将按照您定义方法的顺序分配变量。

例如,如果您定义:

public void myMethod(String one, String two, String three) {
    some code;
}

然后你这样称呼这个方法:

myMethod("one", "two", "three");

然后在myMethod中,您现在可以使用变量onetwothree来访问这些字符串值。

为什么要传递值而不是让方法通过类访问它的原因是java Math类。当您调用Math.floor(decimalValue)时,您希望为Math类提供decimalValue,并让Math类使用它来确定楼层,然后将其返回给您。您不想编写程序,以便Math类和其他所有程序都可以随时访问decimalValue

这能解释一切吗?