剑客
关注科技互联网

第 6 单元:向一个 Java 类添加行为

开始之前

本单元是 “Java 编程入门” 学习路径的一部分。尽管各单元中讨论的概念具有独立性,但实践组件是在您学习各单元的过程中逐步建立起来的,推荐您在继续学习之前复习 前提条件、设置和单元细节

单元目标

  • 了解如何手动编写访问器方法对的声明
  • 学习使用或不使用参数调用方法的正确语法
  • 了解嵌套的方法调用

访问器方法

您在第 5 单元末看到的实际使用的 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
引用来执行该调用;而使用类的名称作为调用的左侧内容。)

这就是方法调用。

测试您的理解情况

  1. 哪个答案最恰当地描述了 Java Beans 模式?
    1. 您可在其中使用 Java API 编写任何符合 Java 规范的应用程序。
    2. 它是一种编写代码的特定方式,规定了如何声明、访问和设置 Java 对象属性的值。
    3. JavaBeans 模式无法实际编码;它仅是一种理想标准。
    4. 上述选项都不是。
  2. 使用 invoke 调用方法与使用 call 调用方法有何区别?
    1. 使用 invoke 调用方法是编写方法的代码来使用 static
      关键字。使用 call 调用方法仅适用于基于实例的对象。
    2. 使用 call 调用方法意味着全面地记录它,而使用 invoke 调用方法是通过 Java 源代码来完成。
    3. 没有区别;使用 call 和 invoke 调用方法都与 “执行方法” 同义。
    4. 只有在使用 Python 或 Ruby 编写代码时存在区别。
    5. 上述选项都不是
  3. 构造方法 不是
    方法。
    1. 它依赖于编译器上下文。
    2. 有时是,但构造方法不能有参数。
  4. 编程问题
    :在 Person
    上实现 toString()
    方法。使用来自第 4 单元 测验中的问题 5 的 Person
    类代码。使用 Object.toString()
    的 Javadoc 了解 toString()
    将要执行的操作的描述。
  5. 编程问题
    :编写一个 JUnit 测试案例来测试问题 4 中的 Person
    上的 toString()
    方法。将您的测试方法添加到第 5 单元 中创建的 PersonTest
    类。

核对您的答案

进一步探索

Java 教程:定义方法

面向对象语言基础,第 2 部分:字段和方法

分享到:更多 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址