向一个 Java 类添加行为
目标
- 了解如何手动编写访问器方法对的声明
- 学习使用或不使用参数调用方法的正确语法
- 了解嵌套的方法调用
访问器方法
您在上一节末看到的实际使用的 getter 和 setter 称为访问器方法。(快速复习:getter 是检索属性值的方法;setter 是修改该值的访问方法。)要封装一个类中来自其他对象的数据,可以将它的变量声明为 private,然后提供访问器方法。
访问器的命名严格遵守称为 JavaBeans 模式 的约定。在此模式中,任何 Foo 属性都有一个称为 getFoo() 的 getter 和一个称为 setFoo() 的 setter。JavaBeans 模式非常常见,所以 Eclipse IDE 中内置了对它的支持,您在生成 Person 的 getter 和 setter 时已看到。
访问器遵循以下准则:
- 属性始终使用 private 访问级别来声明。
- getter 和 setter 的访问修饰符是 public。
- getter 不接受任何参数,返回一个与它访问的属性同类型的值。
- setter 仅接受一个与该属性同类型的参数,而且不返回值。
声明访问器
目前为止,声明访问器的最简单方法是让 Eclipse 为您声明。但您还需要知道如何手动编写一个 getter 和 setter 对。
假设我有一个属性 Foo,它的类型为 java.lang.String。我的完整 Foo 声明(依照访问器准则)是:
private String foo;
public String getFoo() {
return foo;
}
public void setFoo(String value) {
foo = value;
}
请注意,传递给 setter 的参数值的名称与 Eclipse 生成的参数值不同(其中参数名称与属性名称相同 — 例如 public void setFoo(String foo))。手动编写 setter 时,在极少数情况下,我会始终使用 value 作为 setter 的参数值名称。这个显眼的名称(我自己的一种命名习惯,而且推荐其他开发人员也这么做)提醒我 setter 是手动编写的。如果不使用 Eclipse 生成 getter 和 setter,则必须有合理的理由。使用 value 作为 setter 的参数值,这会提醒我这个 setter 很特殊。(代码注释可达到同样的目标。)
调用方法
调用 方法很容易。举例而言,第 5 单元末尾的 testPerson 方法调用 Person 的不同 getter 来返回它们的值。现在您将学习执行方法调用的正式原理。
使用和不使用参数的方法调用
要在一个对象上调用一个方法,需要使用该对象的引用。方法调用语法包含:
- 对象引用
- 一个句点
- 方法名称
- 所有需要传递的参数
不使用参数的方法调用的语法为:
objectReference.someMethod();
以下是一个示例:
Person p = new Person("Joe Q Author", 42, 173, 82, "Brown", "MALE");
p.getName();
使用参数的方法调用的语法为:
objectReference.someOtherMethod(parameter1, parameter2, . . ., parameterN);
以下是一个示例(设置 Person 的 Name 属性):
Person p = new Person("Joe Q Author", 42, 173, 82, "Brown", "MALE");
p.setName("Jane Q Author");
请记住,构造方法也是一种方法。而且您可以使用空格和换行符来分隔参数。Java 编译器并不关心分隔方法。接下来的两个方法调用是等效的:
new Person("Joe Q Author", 42, 173, 82, "Brown", "MALE");
new Person("Joe Q Author",// Name
42, // Age
173, // Height in cm
82, // Weight in kg
"Brown",// Eye Color
"MALE");// Gender
请注意,第二个构造方法调用中的注释使得下一个使用此代码的人更容易理解。该开发人员一眼就能看出每个参数的用途。
嵌套的方法调用
方法调用也可嵌套:
Logger l = Logger.getLogger(Person.class.getName());
l.info("Name: " + p.getName());
在这里,您将 Person.class.getName() 的返回值传递给 getLogger() 方法。请记住,getLogger() 方法调用是一个静态方法调用,所以它的语法稍有不同。(您不需要一个 Logger 引用来执行该调用;而使用类的名称作为调用的左侧内容。)
这就是方法调用。