1

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

4

7 回答 7

5

成绩册的故事

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

在此处输入图像描述

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

敲,敲。是教师课。

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

成绩簿:不,我没有!(吞咽

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

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

实际上...

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

public String courseName;

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

封装,用外行的话来说。

于 2013-04-12T15:15:52.933 回答
4

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

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

public String getCourseName() { ... }

并提供对 courseName 的写访问权限,您需要提供一个 setter 方法:

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

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

于 2013-04-12T14:53:09.363 回答
2

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

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

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

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

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

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

于 2013-04-12T15:07:18.477 回答
1

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

于 2013-04-12T14:53:01.937 回答
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();
}
于 2013-04-12T14:55:11.400 回答
1

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

于 2013-04-12T14:55:57.327 回答
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 类使用它来确定地板,然后将其返回给您。你不想编写你的程序,以便数学类和其他所有东西都可以一直访问你decimalValue

这是否说明了一切?

于 2013-04-12T15:17:09.567 回答