【问题标题】:Getters and setters in Java [closed]Java中的getter和setter [关闭]
【发布时间】:2013-04-12 14:50:42
【问题描述】:

我对@9​​87654323@ 很陌生,我正在尝试理解一些概念。我一直在读几本书,但我一直在同一个地方难过。看下面的代码:

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() 需要(字符串名称)在那里,或者它甚至从哪里获得该值。如果有人可以尝试用外行的方式解释这一点,将不胜感激。

【问题讨论】:

标签: java get set


【解决方案1】:

成绩册的故事

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

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

敲,敲。这是Teacher类。

老师:嘿,我发现你是GradeBook班,让我给你分配今天的课程。我想你有一个courseName 变量?

成绩簿:不,我不知道! (一饮而尽)

在想……嗯,我怎么能保守秘密,但仍然让她给我这个课程名称?我非常需要那个。

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

其实……

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

public String courseName;

但这是一个很大的 BUT: 这无异于把你的日记放在草坪上,让你的邻居或任何路人随心所欲。你不会这样做对吗?

封装,通俗地说。

【讨论】:

  • 太棒了,带有一丝头上的味道;)
  • 哈哈!谢谢@noob!关心赞成票吗? :)
【解决方案2】:

欢迎来到面向对象编程。您的成员变量 courseName 是私有的,不能从外部访问。

要提供对 courseName 变量的读取访问权限,您需要提供一个 getter 方法:

public String getCourseName() { ... }

为了提供对 courseName 的写入权限,您需要提供一个 setter 方法:

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

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

【讨论】:

  • 我不知道为什么 setCourseName 需要 ( String name ) 位。你介意透露一点吗?
  • @Blank1268:抱歉不得不去工作。正如我在回答中指出的那样:关于:public void setCourseName (String name) { ... } 这里名称被作为参数传递到 setter 方法,该方法用于使用此行将值设置为私有变量 courseName courseName = name;跨度>
【解决方案3】:

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

通过这个简单的示例,很难理解为什么会这样设计这个类。可以很容易地将courseName 设为公共字段并让客户端代码直接操作它。然而,随着类变得越来越复杂,使用 get/set 样式提供了许多优势。以下是一些:

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

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

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

在一般的面向对象编程中,默认的设计应该是尽可能的隐藏类的实现,只通过方法暴露类。有时有充分的理由违反这一原则,但坚持它往往会产生更强大的软件。

【讨论】:

    【解决方案4】:

    这个类本身从不使用setCourseName,但理论上它可以用来改变私有变量courseName

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

        请阅读 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();
        }
        

        【讨论】:

          【解决方案7】:

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

          看起来您实际上是在询问 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) 时,您希望将您的decimalValue 提供给Math 类,并让Math 类使用它来确定地板,然后将其返回给您。您不想编写程序以便 Math 类和其他所有内容都可以随时访问您的 decimalValue

          这说明了一切吗?

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-04-06
            • 1970-01-01
            • 2019-08-07
            • 2011-04-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多