我是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()
需要(字符串名称),或者甚至从哪里获取该值。如果有人试图以外行的方式解释这一点,我们将不胜感激。
答案 0 :(得分:5)
GradeBook 有一个秘密。它是名为 courseName 的private
成员变量。
成绩簿:除了我,没有人接触过这个变量!
敲门,敲门。这是教师类。 老师:嘿,我发现你是一本 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方法有助于将客户端代码与实现类的更改隔离开来。例如,您可能稍后决定课程名称具有某种内部结构,并且您希望将名称的各个部分保留在单独的字段中。您只需更改setCourseName
和getCourseName
的实施方式,就不需要更新客户端代码。
自动化软件生成工具依赖于属性getter和setter的存在。使用这些工具,您可以简单地将您的类建模为具有“courseName”属性,并且它将生成使用适当方法的代码。
您可能稍后决定更改课程名称应该具有某些副作用(例如在某处更新课程目录)。可以通过修改setCourseName
方法来实现这些依赖关系。
通常使用面向对象的编程,默认设计应该是尽可能地隐藏类实现并仅通过方法公开类。有时候有充分理由违反这一原则,但坚持这一原则往往会产生更强大的软件。
答案 3 :(得分:1)
此类本身从不使用setCourseName
,但从理论上讲,它可用于更改私有变量courseName
。
答案 4 :(得分:1)
请阅读encapsulation
和data 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中,您现在可以使用变量one
,two
和three
来访问这些字符串值。
为什么要传递值而不是让方法通过类访问它的原因是java Math
类。当您调用Math.floor(decimalValue)
时,您希望为Math类提供decimalValue,并让Math类使用它来确定楼层,然后将其返回给您。您不想编写程序,以便Math类和其他所有程序都可以随时访问decimalValue
。
这能解释一切吗?