《java面向对象程序设计第五章.ppt》由会员分享,可在线阅读,更多相关《java面向对象程序设计第五章.ppt(40页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、Java 初级初级第五章面向对象(中)主要内容主要内容l面向对象的特征l封装l继承l类的多态面向对象的特征面向对象的特征面向对象的特征用面向对象语言例如Java所编的程序就一定是面向对象程序吗?回答是否定的,关键看是否用了面向对象的基本特征。面向对象特征主要有:封装、继承与多态。封装封装的定义封装的定义l概念:利用抽象数据类型将数据和基于数据的操作封装在一起,数据被保存在抽象数据类型内部,系统的其他部分只有通过对象被授权的操作,才能访问这个数据。l意义自定义数据类型更完善类内部实现细节的变化不会影响外部使用类/对象中的内部数据更安全符合“高内聚、低耦合”的软件设计要求一个例子一个例子class
2、FighterPlaneprivateStringname;privateintmissileNum;public voidsetName(String_name)if(_name!=null)name=_name.trim();publicvoidsetNum(int_missileNum)if(_missileNum0)missileNum=_missileNum;publicvoidfire()if(missileNum0)System.out.println(“nowfireamissile!”);elseSystem.out.println(“Nomissileleft!”);/en
3、dclass对象访问控制访问控制体现封装,则需要掌握访问控制public,protected,private,“缺省”的用法。在java中这些修饰符可以修饰的种类有3种:修饰类修饰类的属性成员(域)修饰类的成员方法类前修饰符类属性成员方法public缺省publicABprotectedB或(B+C)B缺省BBprivateDD权限依次增大权限依次增大A:所有类B:包中的类D:D:本类本类C:C:所有子类所有子类E E:包中子类:包中子类访问控制访问控制注意注意l两个类同写在一个文件中,只能有一个类为public;l对象之间方法调用,访问修饰符为protected,应用范围为“B”;l产生对象
4、时,类的构造方法前修饰符为private,则只能在类的内部产生对象,从而引出“单件模式”;l子类继承,当访问修饰符为protected时,应用范围为“BC”。访问控制举例访问控制举例1packagecom.resource;publicclassFighterPlanepublicStringname;publicintmissileNum;publicvoidfire()if(missileNum0)(nowfireamissile!);missileNum-=1;else(Nomissileleft!);packagecom.run;importcom.resource.*;publicc
5、lassRunPlanepublicstaticvoidmain(Stringargs)FighterPlanefp=newFighterPlane();fp.name=苏35;fp.missileNum=6;fp.fire();访问控制举例访问控制举例2packagecom.resource;publicclassFighterPlanepublicstaticStringname=苏35;packagecom.run;importcom.resource.*;publicclassRunPlanepublicstaticvoidmain(Stringargs)System.out.prin
6、tln(FighterPlane.name);访问控制举例访问控制举例3(单件模式)(单件模式)packagecom.resource;publicclassFighterPlaneprivateStringname;privateintmissileNum;private static FighterPlane fp;private FighterPlane(String_n,int_mn)name=_n;missileNum=_mn;publicstaticFighterPlanegetInstance(String_n,int_mn)if(fp=null)fp=newFighterPla
7、ne(_n,_mn);returnfp;publicvoidfire()if(missileNum0)System.out.println(nowfireamissile!);missileNum-=1;elseSystem.out.println(Nomissileleft!);packagecom.run;importcom.resource.*;publicclassRunPlanepublicstaticvoidmain(Stringargs)FighterPlanefp;fp=FighterPlane.getInstance(苏苏35,6);fp.fire();访问控制举例访问控制举
8、例4(演示)(演示)packagecom.resource;publicclassFighterPlaneprotectedStringname;protectedintmissileNum;publicvoidfire()if(missileNum0)System.out.println(fireamissile!);missileNum-=1;elseSystem.out.println(Nomissileleft!);/endclasspackagecom.run;importcom.resource.*;publicclassRunPlaneextendsFighterPlanepri
9、vatevoidinit()name=su35;missileNum=5;publicstaticvoidmain(Stringargs)FighterPlanefp=newFighterPlane();fp.name=“苏35”;/error!fp.missileNum=6;/error!fp.fire();/endclass访问控制举例访问控制举例5classTestprivateintvalue;publicstaticvoidmain(Stringargs)Testt=newTest();System.out.println(t.value);消息消息消息的实质就是引用向对象发出的服务
10、请求,是对数据成员和成员方法的调用,例如fp.name和fp.fire()就是发送消息消息(消息(Cont)能否发送消息取决于:l引用必须引用了特定的对象,否则会在运行时抛出NullPointerException异常。(举个例子)l对象必须定义了相应的属性或方法,否则编译不会通过l被访问的属性或方法必须具有可访问的权限,也就是说和封装的内容相互关联消息(消息(Cont)当fp作为A对象的属性时,A对象就可以向FighterPlane发送消息,控制FighterPlane产生相应的操作。同时,当FighterPlane中也有A对象的引用时,它也可向A对象发送消息,控制A产生相应的操作,它们之间
11、就存在关联关系了图5-5消息(代码示例)消息(代码示例)classFighterPlaneStringname;intmissileNum;publicFighterPlane(String_name,int_missileNum)name=_name;missileNum=_missileNum;publicvoidfire()if(missileNum0)System.out.println(fireamissile!);missileNum-=1;elseSystem.out.println(Nomissileleft!);classAFighterPlanefp;publicA(Fig
12、hterPlanefpp)this.fp=fpp;publicvoidinvoke()/发送消息给FighterPlane的对象System.out.println(fp.name);publicclassRunpublicstaticvoidmain(Stringargs)FighterPlaneftp=newFighterPlane(su35,10);/产生A对象,并将ftp对象引用作为参数传入Aa=newA(ftp);/发送消息,产生调用关系a.invoke();继 承继承继承l通过extends关键字实现;l子类可以从父类继承所有非private的属性和方法作为自己的成员;继承举例继承
13、举例classPlaneprotectedStringname;publicvoidsetName(String_name)name=_name;publicStringgetName(String_name)returnname;classFighterPlane extends PlaneprivateintmissileNum;publicvoidsetNum(int_missileNum)missileNum=_missileNum;publicvoidfire()missileNum-=1;PlaneprotectedStringname;publicvoidsetName(Stri
14、ng_name)publicStringgetName()FightPlaneprivateintmissileNum;publicvoidsetNum(int_missileNum)publicvoidfire()FightPlaneprotectedStringname;privateintmissileNum;publicvoidsetName(String_name)publicStringgetName()publicvoidsetNum(int_missileNum)publicvoidfire()继承效果如下:当name前的修饰符为public时:PlanepublicStrin
15、gname;publicvoidsetName(String_name)publicStringgetName()FightPlaneprivateintmissileNum;publicvoidsetNum(int_missileNum)publicvoidfire()FightPlanepublicStringname;privateintmissileNum;publicvoidsetName(String_name)publicStringgetName()publicvoidsetNum(int_missileNum)publicvoidfire()继承效果如下:当name前的修饰符
16、为private时:PlaneprivateStringname;FightPlaneprivateintmissileNum;publicvoidsetNum(int_missileNum)publicvoidfire()FightPlaneprivateintmissileNum;publicvoidsetNum(int_missileNum)publicvoidfire()继承效果如下:当name前的修饰符为private时:PlaneprivateStringname;publicvoidsetName(int_name)publicStringgetName()FightPlanep
17、rivateintmissileNum;publicvoidsetNum(int_missileNum)publicvoidfire()FightPlaneprivateStringname;privateintmissileNum;publicvoidsetName(String_name)publicStringgetName()publicvoidsetNum(int_missileNum)publicvoidfire()继承效果如下:注意:l子类在继承父类的时候,首先应该满足父类可被访问,因为子类有可能和父类不在同一个包内l凡是修饰符为public或是protected的父类属性成员或
18、是方法能够被子类所访问;private的属性成员或是方法不能被子类访问lprivate属性成员其所以能被子类访问,关键在于子类获得了父类setName和getName的访问权,但是子类在其内部无法直接访问父类私有变量namelObject类是所有类的共同祖先,即使定义类时没有写extentsObjectl在Object当中定义了许多方法,这些方法都可以被所有子类所继承Object类类方法名方法名说明说明备注备注Objectclone()将当前对象克隆Boolenequals(Objectobj)判断两个引用是否指向同一对象,其参数不能为普通数据类型被很多子类重载,用于用语判断对象的内容是否一致
19、,如String,包装类,URL,File,java.util包中的类或接口等voidfinalize()对象被释放时使用ClassgetClass()获得当前对象的类对象注意Class中的首字母大写inthashCode()得到代表对象的一个整数,这个整数在应用程序运行时保持不变这个整数的意义类似对象的身份证号码,String,包装类,URL,File,java.util包中的类或接口将本方法覆盖,当内容相同时得到的hashCode值相同StringtoString()得到代表这个对象的字符串String,包装类,URL,File,java.util包中的类或接口将本方法覆盖,得到的值将是其
20、对象内容Voidnotify用于线程同步中唤醒等待的线程Voidwait()应用于线程同步中的线程等待lFrameWork半成品软件l继承java.applet包中的Applet类编写Applet程序l继承包中的HttpServlet类编写servlet程序在框架编程中的应用在框架编程中的应用l继承的作用:代码复用l最终类:final修饰的类,不能被继承继承继承强调两点强调两点多态多态的定义多态的定义l多态的概念:多态是指一个程序中同名的不同方法共存的情况lJava中提供两种多态的机制:重载(overloading)与覆盖(overriding)类Parent中有两个getScore方法,它们
21、的参数有所不同classParentpublicintgetScore()return3;publicintgetScore(inti)returni;重载例重载例1重载例重载例2AudioClipgetAudioClip(URLurl)根据URL获得AudioClip对象AudioClipgetAudioClip(URLurl,Stringname)根据URL和name联合构成的URL得到AudioClip对象publicAudioClipgetAudioClip(URLurl)。;publicAudioClipgetAudioClip(URLurl,Stringname)try/通过重新构
22、造一个新的URL对象,之后调用上面的同名方法来实现功能。returngetAudioClip(new URL(url,name);catch(MalformedURLExceptione)returnnull;如:classApplet重载例重载例3BooleanaddAll(Collectionc)将一个集合对象插入到链表末尾当中。BooleanaddAll(intindex,Collectionc)将一个集合对象插入到链表的指定位置当中。publicbooleanaddAll(Collectionc)returnaddAll(size,c);/size是链表长度,此方法调用下面的方法,将传
23、入对象插入到指定链表尾部/index是链表的当前索引号publicbooleanaddAll(intindex,Collectionc)再如:java.util.ClassLinkedList子类对父类的同名方法(方法名称相同,参数相同,返回类型相同)重新进行定义,即在子类中定义与父类中已定义的相同名而内容不同的方法。方法名称相同,参数名称相同,返回类型相同:覆盖方法名称相同,参数名称不同:重载方法名称相同,参数名称相同,返回类型不同:编译不能通过覆盖覆盖classParentpublicintgetScore()return3;publicStringgetCountryName()retu
24、rn“China”;覆盖例覆盖例1classSonextendsParentpublicintgetScore()return4;publicclassRunSonpublicstaticvoidmain(Stringargs)Sons=newSon();System.out.println(s.getScore();System.out.println(s.getCountryName();输出结果:4Chinal子类的访问修饰符权限应等于或大于父类lstatic方法不能覆盖非静态方法,也不能被非static方法覆盖,但是static方法可以覆盖static方法l方法前有final修饰符,此
25、方法不能在子类方法中进行覆盖l在JDK中,很多父类的方法被子类重新覆盖,赋予了不同的含义,如Object类中的booleanequals(Objectobj)方法l抽象类中如果存在抽象方法,则具体子类必须对抽象方法进行覆盖覆盖覆盖注意注意classSuperpublicIntegergetLenght()returnnewInteger(4);publicclassSubextendsSuperpublicLongGetLenght()returnnewLong(5);publicstaticvoidmain(Stringargs)Supersooper=newSuper();Subsub=newSub();System.out.println(sooper.getLenght().toString()+,+sub.getLenght().toString();覆盖例覆盖例2输出结果:4,4