June2002byMonaVajihollahiRoozbehFarahbod面向对象程序设计——Java第五章类与对象ByMonaVajihollahi[mvajihol@cs.sfu.ca]&RoozbehFarahbod[rfarahbo@cs.sfu.ca]面向过程与面向对象(OOP)开始顺序,阶段结束对象2对象3对象4对象5对象0对象1ByMonaVajihollahi[mvajihol@cs.sfu.ca]&RoozbehFarahbod[rfarahbo@cs.sfu.ca]类的定义与对象的创建classCar{intcolor_number;intdoor_number;intspeed;voidbrake(){…}voidspeedUp(){…};voidslowDown(){…}}计算机中的对象的原型现实生活中的对象ByMonaVajihollahi[mvajihol@cs.sfu.ca]&RoozbehFarahbod[rfarahbo@cs.sfu.ca]类的定义与对象的创建•什么是类?•类是描述对象的“基本原型”,它定义一种对象所能拥有的数据和能完成的操作,在面向对象的程序设计中,类是程序的基本单元。•程序中的对象是类的一个实例,是一个软件单元,它由一组结构化的数据和在其上的一组操作构成。variablesmethodsByMonaVajihollahi[mvajihol@cs.sfu.ca]&RoozbehFarahbod[rfarahbo@cs.sfu.ca]类的定义与对象的创建•变量:即指对象的所知道的状态•方法:指对象的功能单元。•什么是消息?–软件对象通过相互间传递消息来相互作用和通信•一个消息由三部分组成:–1.接受消息的对象–2.要完成方法的名字–3.方法需要的参数对象B对象AmessageByMonaVajihollahi[mvajihol@cs.sfu.ca]&RoozbehFarahbod[rfarahbo@cs.sfu.ca]类的定义与对象的创建•一个例子•在程序中操作对象是类的一个实例:即对象•创建一个对象Helloobj=newHello();•调用方法obj.showString(“HelloWorld!”)classHello{}privateStrings;publicvoidshowString(){System.out.println(s);}publicvoidchangeString(Stringstr){s=str;returns;}ByMonaVajihollahi[mvajihol@cs.sfu.ca]&RoozbehFarahbod[rfarahbo@cs.sfu.ca]类的定义与对象的创建•Java语言规定:一个文件中,只允许存在一个public类,并且public类的类名要与文件名保持一致,并且只有包含main()方法所在的类才能成为一个public类。•对象名被称为“引用”或“引用变量”man1height=180age=20对象man2=引用ByMonaVajihollahi[mvajihol@cs.sfu.ca]&RoozbehFarahbod[rfarahbo@cs.sfu.ca]成员方法•定义方法的格式:返回数值类型方法名(形式参数){方法体;}void返回类型无参方法多参方法ByMonaVajihollahi[mvajihol@cs.sfu.ca]&RoozbehFarahbod[rfarahbo@cs.sfu.ca]局部变量和成员变量•局部变量的作用域在该方法内部。•若局部变量与类的成员变量同名,则类的成员变量被隐藏。•在使用局部变量之前,必须首先对其进行初始化。ByMonaVajihollahi[mvajihol@cs.sfu.ca]&RoozbehFarahbod[rfarahbo@cs.sfu.ca]局部变量和成员变量classVariable{intx=0,y=0,z=0;//类的成员变量voidinit(intx,inty){this.x=x;this.y=y;intz=5;//局部变量,隐藏全局变量System.out.println(“**ininit**”);System.out.(“x=”+x+“y=”+y+“z=”+z)}}ByMonaVajihollahi[mvajihol@cs.sfu.ca]&RoozbehFarahbod[rfarahbo@cs.sfu.ca]局部变量和成员变量•publicclassClass8{publicstaticvoidmain(String[]args){inta;System.out.println(a);——wrong!}}ByMonaVajihollahi[mvajihol@cs.sfu.ca]&RoozbehFarahbod[rfarahbo@cs.sfu.ca]局部变量和成员变量•如果成员变量未被初始化,系统将自动根据其所属的类型进行初始化。基本数据类型变量,系统将自动为其赋0;引用型变量,系统自动为其赋null。•如何判断一个引用是否引用了一个对象?ByMonaVajihollahi[mvajihol@cs.sfu.ca]&RoozbehFarahbod[rfarahbo@cs.sfu.ca]this引用•this-----用在一个方法中引用当前对象,它的值是该方法所在的对象。classHi{inta;voidSetA(intb){a=b;}intgetA{returna;}}classHi{inta;voidSetA(intb){this.a=b;}intgetA{returnthis.a;}}ByMonaVajihollahi[mvajihol@cs.sfu.ca]&RoozbehFarahbod[rfarahbo@cs.sfu.ca]静态变量(类变量)•类变量——为类的各实例共享的变量。static静态变量;•位于类的内存区域中,为该类的各个对象共享.•无此限定符的变量是实例变量。classex{inti;staticintj;staticfinalintk=10;---}•为节省空间,final常量可同时定义为static类exjk=10对象1i:3对象2i:5ByMonaVajihollahi[mvajihol@cs.sfu.ca]&RoozbehFarahbod[rfarahbo@cs.sfu.ca]静态变量(类变量)•实现各实例之间的通讯。•跟踪创建的实例数。publicclassCount{privateintserial;//成员变量privatestaticintcounter=0;//类变量publicCount(){counter++;serial=counter;}}•静态变量类似于某些语言中的全局变量。ByMonaVajihollahi[mvajihol@cs.sfu.ca]&RoozbehFarahbod[rfarahbo@cs.sfu.ca]静态变量(类变量)•非private的静态变量无须创建实例就可以从类的外部访问。publicclassStaticVar{publicstaticintx;}publicclasstest{publicvoidm(){intm=StaticVar.x;}}ByMonaVajihollahi[mvajihol@cs.sfu.ca]&RoozbehFarahbod[rfarahbo@cs.sfu.ca]静态变量(类变量)classPhoneCard200{staticfinalStringconnectNumber=“200”;staticdoubleadditoryFee;longcardNumber;intpassword;booleanconnected;doublebalance;…}ByMonaVajihollahi[mvajihol@cs.sfu.ca]&RoozbehFarahbod[rfarahbo@cs.sfu.ca]静态变量(类变量)publicclassa{publicstaticvoidmain(Stringargs[]){PhoneCard200my200_1=newPhoneCard200();PhoneCard200my200_2=newPhoneCard200();PhoneCard200.additoryFee=0.1;System.out.println(“第一张200卡的接入号码:”+my200_1.connectNumber);System.out.println(“200卡接入号码:”+PhoneCard200.connectNumber);System.out.println(“第二张200卡的附加费:”+my200_2.additoryFee);System.out.println(“200卡类的附加费:”+PhoneCard200.additoryFee);}}ByMonaVajihollahi[mvajihol@cs.sfu.ca]&RoozbehFarahbod[rfarahbo@cs.sfu.ca]静态方法(类方法)•类方法:static方法名(…){…}•使用类方法不用创建类的对象。调用这个方法时,应该使用类名做前缀,而不是某一个具体的对象名。•非static的方法是对象方法(或称实例方法)。•类方法中不能访问实例变量,而只能访问类变量(static方法—static域)和自己的方法参数。•类方法中不能直接使用本类中的实例方法,只能使用其他的static方法。•类方法中没有this值。ByMonaVajihollahi[mvajihol@cs.sfu.ca]&RoozbehFarahbod[rfarahbo@cs.sfu.ca]静态方法(类方法)publicclassa{publicstaticvoidmain(String[]args){System.out.println(Math.round(3.54));Strings=to_char(2.718);System.out.println(“e=“+s);}staticStringto_char(doublex){returnDouble.toString(x);}}ByMonaVajihollahi[mvajihol@cs.sfu.ca]&RoozbehFarahbod[rfarahbo@cs.sfu.ca]静态方法(类方法)•main方法是静态方法,这是为了系统在没有任何实例化对象之前可以运行一个应用程序。•如果main方法要调用本类的其它方法:–将这些方法设计成静态方法,–创建对象,使用对象方法。•一个静态方法不能被一个非静态方法所覆盖。ByMonaVajihollahi[mvajihol@cs.sfu.ca]&RoozbehFarahbod[rfarahbo@cs.sfu.ca]包(package)•在操作系统中,目录用来组织文件,设置权限。•Java利用包来组织相关的类,并控制访问权限。•包是一种松散的类的集合。一般不要求处于同一个包中的类有明确的相互关系,如包含、继承等等。•由于同一包中的类在缺省情况下可以互相访问,所以为了方便编程和管理,通常把需要在一起工作的类放在一个包里。•利用包来管理类,可实现类的共享与复用(类库)。ByMonaVajihollahi[mvajihol@cs.sfu.ca]&RoozbehFarahbod[rfarahbo@cs.sfu.ca]编译单元•一个java源代码文件称之为一个编译单元。•一个编译单元中只能有一个public类,该类名与文件名相同。编译单元中的其他类是该主public类的支撑类。•经过编译,编译单元中的每个类都产生一个.class文件。•java的工作程序是一串.class文件,JAVA解释器负责寻找、加载和解释这些文件。(不象其它语言最终生成一个.exe的可执行文件)ByMonaVajihollahi[mvajih