学习访问器(存取(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属性的完整的访问器方法:
代码语言:javascript复制private String foo;
public String getFoo() {
return foo;
}
public void setFoo(String value) {
foo = value;
}
调用方法
方法的调用时很简单的,第五节的测试用例中已经展示了调用getter方法获得对应的属性值了。
无参方法的调用
调用一个对象的方法,你需要引用这个对象。方法的调用包含:
- 对象的引用
- 点符.
- 方法名
- 需要传入的参数
无参方法调用的语法:
代码语言:javascript复制objectReference.someMethod();
这是一个示例:
代码语言:javascript复制Person p = new Person("Joe Q Author", 42, 173, 82, "Brown", "MALE");
p.getName();
含参方法的调用:
代码语言:javascript复制objectReference.someOtherMethod(parameter1, parameter2, . . ., parameterN);
这是一个示例(设置name属性值):
代码语言:javascript复制Person p = new Person("Joe Q Author", 42, 173, 82, "Brown", "MALE");
p.setName("Jane Q Author");
我们还记得,构造器也是方法。调用方法时,你可以用空格和换行符分隔参数。下面两种方式是一样的:
代码语言:javascript复制/*方式一*/
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
注意上面的注释,可以让之后接手项目的人容易看懂。一看,开发人员就可以知道每个参数是什么。
嵌套方法的调用
方法可以嵌套调用:
代码语言:javascript复制Logger l = Logger.getLogger(Person.class.getName());
l.info("Name: " p.getName());
这里,通过Person.class.getName()的返回值作为调用 getLogger()的参数。还记得,getLogger是静态方法的调用,使用类名调用,和对象方法稍有不同。
测测你学到多少
代码语言:javascript复制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中去。.
答案见下一节。