Lesson 5,Classes and Objects (Part 2)
类与对象 (下 )
LiFan(李凡)
Chengdu University of Information Technology
The Department Of Computer Science
2005
Methods (方法 )
? 方法是语句的结合,方法中的语句可以访问
和修改类或类的对象中域,也可以使用域存
放的数据进行复杂的计算
? 方法体现了 OOP中严格区分“做什么”和
“怎么做”的思想
? 方法 (特别是 public方法 )又被看作是类的设
计者和类的使用者之间的契约 (contract)
Declaring Methods (声明方法 )
? 方法位于类体中,方法声明由方法头和方法
体两部分构成,方法头中要声明方法的返回
类型和方法可能跑出的异常列表
<修饰符 > <返回类型 > <方法名 >(<参数列表 >) <异常列表 >{
/*… 方法体 …*/
}
? 如果方法头中声明的返回类型不是 void,则方
法体结束时必须通过 return语言返回执行结果
class BodyPrint{
public static void main(String[] args)
{
Body sun=new Body(“Sun”);
Body earth=new Body(“Earth”);
earth.orbits=sun;
System.out.println(“Body,+earth.name+
,orbits,+earth.orbits.name)
}
}
java BodyPrint
Body Earth orbits Sun
方法头
方法体
Method Modifiers (方法的修饰符 )
? 方法可使用一下修饰符,
访问控制修饰符 — 与域相同
abstract — 声明为 abstract的方法没有方法体,一般定义在抽象
类中,被子类实现
static — 声明为 static的方法是类的方法,否则为对象的方法
final — 声明为 final的方法不能被子类覆盖 (overridden)
synchronized — 当方法可能被多个线程,为了保持对象状态的
一致性,可以通过 synchronized来控制线程对方法的访问
native — 声明为 native的方法,又称为本地方法,这种方法通
常由其它语言实现
strictfp — 与类相同
Access Control (方法的访问控制 )
? 通过访问控制修饰符 (access modifiers)可以限制方
法在类或对象外部的可见性
public — 共有的,方法在任何地方都可以通过
类或类的对象调用
protected — 受保护的,方法仅在类体中、子类
类体中或同包的其它类类体中可调用
private — 私有的,方法仅在类体中可调用
package — 默认的,没有任何访问修饰符修饰的
方法,仅在类体中、同包的其它类类体中可调用
Invoking Methods (调用方法 )
? 对于 static方法,可以通过“类名,方法”调

System.gc()
? 对于对象的方法,在对象被创建后,可以通
过“对象的引用,方法”调用
System.out.println(…);
class Body{
……
public String toString(){
return,Body,+name;
}
public static void main(String[] args){
Body earth=new Body(“Earth”);
System.out.println(earth);
}
}
java Body
Body Earth
Method Execution (方法的执行 )
? 方法被调用后,执行的结果可能有以下几种,
(1) 通过 return语句返回结果
(2) 执行到最后一条语句,自动结束
(3) 抛出未捕获的异常
public class Permissions{
public boolean canDeposit,canWithdraw,canClose;
}
public class BankAccount{
private long number;
private long balance;
public Permissions permissionsFor(Person who){
Permissions perm=new Permissions();
perm.canDeposit=canDeposit(who);
perm.canWithdraw=canWithdraw(who);
perm.canClose=canClose(who);
return perm;
}
……
}
方法的参数传递
? 方法调用时参数值的传递可以分为“值传递”
和“引用传递”两种
? 值传递 — 当方法的参数为基本数据类型时,
实参的值被复制给形参,改变形参不会影响
实参的值
? 引用传递 — 当方法的参数为对象引用时,
实参和形参都同时引用了同一对象,通过形
参修改对象的状态后会影响对象的其它引用
class PassByValue{
public static void main(String[] args){
double one=1.0;
System.out.println(“before,one=”+one);
halveIt(one);
System.out.println(“after,one=”+one);
}
public static void halveIt(double arg){
arg=arg/2.0;
System.out.println(“havled,arg=”+arg);
}
}
java PassByValue
before one=1.0
halved arg=0.5
after one=1.0
Ref{
Body sirius new Body(“Sirius”); //天狼星
”+sirius.name);
commonName(sirius);
“before:,+sirius.name);
commonName(Body bodyRef){
bodyRef.name=“Dog Star”;
bodyRef=null;
java PassRef
before,Sirius
,Dog Star
Overloading Methods (方法重载 )
? 方法的签名 (signature):声明方法的方法头
中方法名加上方法的参数列表
? 类体中不能声明签名完全相同的两个方法
? 当两个方法具有相同的方法名,但有不同数
量或类型的参数,而导致不同的方法签名时,
称这两个方法互相重载
System.out.println(“earth”);
System.out.println(100);
System.out.println(new Body(“Sun”));
main方法
? main方法必须声明为以下格式,
public static void main(String[] args){…}
? main方法是程序执行时第一个被执行的
方法
? 以 main方法作为执行起点的 Java程序又
称为 Java Application
Assignments (作业 )
? 完成课本第二章的下列习题
P51 练习 2.9 P54 练习 2.10 P59 练习 2.12
P59 练习 2.14 P61 练习 2.16 P62 练习 2.17
(下周一之前上传 )
? 阅读课本第六章 6.1,6.5小节,写阅读报告
(周日前上传 )