学习访问器(存取(getter、setter))方法的声明使用和方法调用


本节学习目标

  • 学会编写使用访问器(存取(getter、setter))方法
  • 学会正确调用无参的或者有参的方法
  • 学会嵌套调用方法

访问器方法

在第五节中展示的getter、setter方法我们也叫访问器方法(迅速温故:getter方法是返回指定属性值的的方法,setter方法是可以设置(修改)指定属性的方法)。封装一个类的实例对象的数据,你需要声明其属性变量为private,然后提供访问器方法。

访问器方法的命名严格遵守JavaBean模式。在这种模式下的一个示例:属性foo有一个getter方法为getFoo(),有一个setter方法为setFoo()。JavaBeans模式是很常见的,Eclipse IDE支持内建,你可以自动生成getter、setter方法,具体步骤可以回顾第五节的内容。

访问器的一些参考:

  • 属性纵使使用private访问控制修饰符修饰
  • getter、setter通常使用public修饰
  • getterXX方法没有参数,它返回该类型对象的指定属性XX的值
  • setter方法有一个参数值为该属性的值,无返回值

声明访问器方法

到目前为止,最简单的方法生成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;
}

调用方法

方法的调用时很简单的,第五节的测试用例中已经展示了调用getter方法获得对应的属性值了。

无参方法的调用

调用一个对象的方法,你需要引用这个对象。方法的调用包含:

  • 对象的引用
  • 点符.
  • 方法名
  • 需要传入的参数

无参方法调用的语法:

objectReference.someMethod();

这是一个示例:

Person p = new Person("Joe Q Author", 42, 173, 82, "Brown", "MALE");
p.getName();

含参方法的调用:

objectReference.someOtherMethod(parameter1, parameter2, . . ., parameterN);

这是一个示例(设置name属性值):

Person p = new Person("Joe Q Author", 42, 173, 82, "Brown", "MALE");
p.setName("Jane Q Author");

我们还记得,构造器也是方法。调用方法时,你可以用空格和换行符分隔参数。下面两种方式是一样的:

/*方式一*/
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是静态方法的调用,使用类名调用,和对象方法稍有不同。

测测你学到多少


1.关于JavaBean模式的最好描述是? a.它是你编写任何java程序都需要遵守的规范. b.这是一种特别的方式,关于如何声明,访问,和设定一个java对象的属性值 c.JavaBean模式无法再编码中使用,它只存在理想条件中. d.以上说法均不对 2.invoking一个方法 and calling一个方法的区别? a.Invoking是使用关键字static调用. Calling方法仅仅针对实例对象的方法. b.Calling一个方法意味着彻底记录它, invoking只在源码层面调用. c.没什么区别,都是执行一个方法 d.区别只在Python或者Ruby语言中. e.以上说法均不对 3.构造器不是方法 a.视编译器而定 b.错 c.有时候是,只是构造器不能有参数 d.对 4.**编程题**:实现Person的toString()方法. 并且将该代码在第5个问题中使用. 使用Javadoc描述toString()方法。 5.**编程题**: 编写一个单元测试用例用来测试第4个问题中你编写的toStirng()方法. 将你的测试方法添加到上一节中的PersonTest中去。.


答案见下一节。