第3章面向对象(上)CopyrightJLUCCSTKanghui23.1面向对象的概念面向过程:创建一个窗口(以c语言为例)创建结构体:定义窗口的大小,位置,颜色,背景等属性,为窗口的各种操作定义相应的函数如HideWindow,MoveWindow,MinimizeWindow这些函数的参数是被操作的窗口,谓语和宾语的关系。面向对象:创建一个窗口定义窗口时,除了要指定属性(大小,位置,颜色,背景等)外,还要指定该窗口可能具有的动作(隐藏,移动,最小化等)这些方法(Hide,Move,Minimize)被调用时,窗口是主语,方法是谓语(如:某个窗口要隐藏),主语与谓语的关系。面向对象的特征:封装(Encapsulation),继承(Inheritance),多态(Polymorphism)CopyrightJLUCCSTKanghui33.2类与对象类:对某一类事物的描述,是抽象的、概念上的定义;对象(实例):实际存在的该类事物的每个个体。面向对象程序设计的重点:类的设计。类3个对象实例CopyrightJLUCCSTKanghui4(一)类的基本概念类是组成Java程序的基本要素;封装了一类对象的状态和方法用来定义对象的模板类的实现包括两部分:类声明和类体基本格式为class类名{…类体的内容……}class是关键字,用来定义类;类名必须是合法的Java标识符;类的声明部分类体CopyrightJLUCCSTKanghui5类的定义class植物//“植物”分别是类名{…}classPerson//习惯上类名的第一个字母大写,但不是必须的;{intage;//类Person的属性,或类成员变量voidshout()//shout是方法也叫类的成员函数{System.out.println(“oh,mygod!Iam“+age);}}shout方法可以直接访问同一个类中的age变量如果一个方法中有与成员变量同名的局部变量,该方法中对这个变量名的访问是局部变量,而不再是成员变量。CopyrightJLUCCSTKanghui6(一)类的基本概念类体写类的目的:描述一类事物共有的属性和功能,描述过程由类体来实现。类声明之后的一对大括号“{“,“}”以及它们之间的内容称做类体,大括号之间的内容称做类体的内容。类体的内容由两部分构成变量的定义,用来刻画属性,方法的定义,用来刻画功能.例:一个类名为“Trapezia”的类,类体内容的变量定义部分定义了4个float类型的变量“上底”,“下底”,“高”和“laderArea”;方法定义部分定义了两个方法“计算面积”和“修改高”.ProgramCopyrightJLUCCSTKanghui7成员变量和局部变量成员变量:类体中的变量定义部分所定义的变量局部变量:方法体中定义的变量和方法的参数成员变量和局部变量的类型:Java中的任何一种数据类型,包括基本类型、引用类型、数组类型和对象;对象也称作类类型变量.classPeople{intboy;floata[];//类成员变量Workmanzhiwei;//类类型成员变量,即对象…voidf(){booleancool;Workmanzhangboy;//类类型局部变量……}}classWorkman{doublex;……}CopyrightJLUCCSTKanghui8成员变量和局部变量成员变量在整个类内都有效,局部变量只在定义它的方法内有效。classSun{intdistance;intfind(){inta=12;distance=a;//合法,distance在整个类内有效.returndistance;}voidg(){inty;y=a;//非法,因为a以失效,而方法g内又没有定义变量a}}成员变量与它在类体中书写的先后位置无关,例如,Trapezia类也可以写成•人们习惯先介绍属性再介绍功能classTrapezia{float上底,laderArea;float计算面积(){laderArea=(上底+下底)*高/2.0f;returnladerArea;}float下底;void修改高(floath){高=h;}float高;}classTrapezia{float上底,下底,高,laderArea;float计算面积(){laderArea=(上底+下底)*高/2.0f;returnladerArea;}void修改高(floath){高=h;}}CopyrightJLUCCSTKanghui10成员变量和局部变量成员变量的划分实例变量:实例成员变量类变量:类成员变量,或静态成员变量成员变量的类型前面加上关键字staticclassdog{floatx;staticinty;……}x是实例变量,而y是类变量.CopyrightJLUCCSTKanghui11成员变量和局部变量若局部变量的名字与成员变量的名字相同成员变量被隐藏,在该方法内暂时失效.classTom{intx=98,y;voidf(){intx=3;y=x;}}y得到的值是3,不是98.如果方法f中没有“intx=3;”语句,y的值将是98.CopyrightJLUCCSTKanghui12成员变量和局部变量若在该方法内想使用成员变量,必须使用关键字this.classTriangle{floatsideA,sideB,sideC,lengthSum;voidsetSide(floatsideA,floatsideB,floatsideC){this.sideA=sideA;this.sideB=sideB;this.sideC=sideC;}}this.sideA,this.sideB,this.sideC分别表示成员变量sideA,sideB,sideC.CopyrightJLUCCSTKanghui13对象的产生与使用创建对象的步骤:对象的声明和为对象分配内存对象的声明一般格式:类的名字对象名字;如,PeoplezhangPing为声明的对象分配内存使用new运算符和类的构造方法为声明的对象分配内存如果类中没有构造方法,系统会调用默认的构造方法默认的构造方法是无参的,构造方法的名字必须和类名相同.如,zhangPing=newPeople();CopyrightJLUCCSTKanghui14对象的产生classXiyoujiRenwu{floatheight,weight;Stringhead,ear,hand,foot,mouth;voidspeak(Strings){System.out.println(s);}}classA{publicstaticvoidmain(Stringargs[]){XiyoujiRenwuzhubajie;//声明对象.zhubajie=newXiyoujiRenwu();//为对象分配内存,使用new运算符和默认的构造方法.….…}}CopyrightJLUCCSTKanghui15对象的产生classPoint{intx,y;Point(inta,intb){x=a;y=b;}}publicclassA{publicstaticvoidmain(Stringargs[]){Pointp1,p2;//声明对象p1和p2.p1=newPoint(10,10);//使用new、类中的构造方法为对象分配内存p2=newPoint(23,35);//使用new、类中的构造方法为对象分配内存………}}如果类里定义了一个或多个构造方法,Java则不提供默认的构造方法.p1=newPoint();//该创建对象非法CopyrightJLUCCSTKanghui16对象的内存模型声明对象时的内存模型XiyoujiRenwuzhubajie;空对象,声明对象变量zhubajie后,zhubajie的内存中还没有任何数据空对象不能使用,因为它还没有得到任何“实体”.必须为对象分配内存,即为对象分配实体.对象的声明和分配内存可由一个步骤完成,XiyoujiRenwuzhubajie=newXiyoujiRenwu();zhubajieCopyrightJLUCCSTKanghui17对象的内存模型对象分配内存后的内存模型当系统见到zhubajie=newXiyoujiRenwu();时,为XiyoujiRenwu类的成员变量分配内存空间,并赋初值;给对象变量zhubajie返回一个引用成员变量的首地址确保分配给height,weight,head,ear,mouth,hand,foot的内存单元将由zhubajie操纵管理CopyrightJLUCCSTKanghui18对象的内存模型classXiyoujiRenwu{floatheight,weight;Stringhead,ear,hand,foot,mouth;voidspeak(Strings){System.out.println(s);}}classA{publicstaticvoidmain(Stringargs[]){XiyoujiRenwuzhubajie;zhubajie=newXiyoujiRenwu();…….….}}0.00.0nullnullnullnullnullweightheightheadearmouthhandfootzhubajie0xAB12CopyrightJLUCCSTKanghui19对象的内存模型创建多个不同的对象XiyoujiRenwuzhubajie=newXiyoujiRenwu();XiyoujiRenwusunwukong=newXiyoujiRenwu();这些对象将被分配不同的内存空间,改变其中一个对象的状态不会影响其它对象的状态.0.00.0nullnullnullnullnullweightheightheadearmouthhandfootzhubajie0xAB120.00.0nullnullnullnullnullweightheightheadearmouthhandfootsunwukong0x111ACopyrightJLUCCSTKanghui20对象的产生Personp1=newPerson();执行完后的内存状态CopyrightJLUCCSTKanghui21对象的使用1.对象的属性:对象操纵自己的变量.对象创建之后,就有了自己的变量,即对象的实体.通过使用运算符“.”,对象可以实现对自己的变量的访问.2.对象的功能:对象调用类中的方法对象创建之后,可以使用运算符“.”调用创建它的类中的方法,从而产生一定的行为功能.当对象调用类中的一个方法时,方法中的局部变量被分配内存空间.方法执行完毕,局部变量即刻释放内存.例PCopyrightJLUCCSTKanghui22对象的使用创建对象后,使用“对象名.对象成员”的格式,访问对象的成员(包括属性和方法)classTestPerson{publicstaticvoidmain(String[]args){Personp1=newPerson();Personp2=newPerson();p1.age=-30;p1.shout();p2.shout();}}classPerson{intage;voidshout(){System.out.println(oh,mygod!Iam+age);}}CopyrightJLUCCSTKanghui23对象的生命周期CopyrightJLUCCSTKanghui24对象的比较对象间的比较:==:判断两个对象的地址是否相等equals():String类的一个成员方法判断两个对象的内容是否相等怎样比较两个数组对象的内容是否相等查看JDK文档classCompare2{publicstaticvoidmain(String[]args