您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > Java_语言与面向对象程序设计(第二版)课件第五章
第5章继承与多态主要内容:继承多态接口和包继承继承:子类利用父类中定义的方法和变量就像它们属于子类本身一样;(包括父类的私有属性、私有方法,但不可见);单重继承:一个类只能有一个父类(Java、C#、VC++);多重继承:一个类可以有多个父类(标准C++);电话卡域:剩余金额方法:拨打电话查询金额无卡号电话卡域:电话机型号方法:获得电话机型号有卡号电话卡域:卡号,密码,接入号码,接通方法:登录交换机IP卡域:有效时间方法:拨打电话200卡域:附加费用方法:拨打电话修改密码电话IC卡方法:拨打电话电话磁卡域:使用地域方法:拨打电话继承继承继承继承继承继承图5-1各种电话卡类及其间继承关系继承的优点、目的优点:更有效地组织程序结构,明确类间关系;目的:使程序结构清晰,提高开发效率,降低编码和维护工作量。派生子类《例5-1》PhoneCard类及其派生子类1.abstractclassPhoneCard2.abstractclassNone_Number_PhoneCardextendsPnoneCard3.abstractclassNumber_PhoneCardextendsPnoneCard问题:第二行、第三行的类为什么是抽象类,能否去掉abstract关键字?域的继承子类继承(拥用)父类的所有非私有(P91~92页各类拥有的域);电话卡域:剩余金额方法:拨打电话查询金额无卡号电话卡域:电话机型号方法:获得电话机型号有卡号电话卡域:卡号,密码,接入号码,接通方法:登录交换机IP卡域:有效时间方法:拨打电话200卡域:附加费用方法:拨打电话修改密码电话IC卡方法:拨打电话电话磁卡域:使用地域方法:拨打电话继承继承继承继承继承继承域的隐藏子类重新定义一个从父类继承来的域变量(可以具有不同类型),称为域的隐藏(指新定义的域变量隐藏了父类的同名变量)。举例:《例5-2》的简化版;1.abstractclassA{2.doublem_a;3.abstractdoublesub();4.doubleget()5.{returnm_a;}}1.classBextendsA{2.doublem_a;3.doublesub()4.{m_a-=1;returnm_a;}5.doublesuper_sub()6.{super.m_a-=1;returnsuper.m_a;}}1.publicclassApplication1{2.publicstaticvoidmain(String[]args){3.Bb=newB();4.b.m_a=100;5.System.out.println(b.get());6.System.out.println(b.sub());7.System.out.println(b.super_sub());}}输出为:099-1;b.m_a=100;b.get()b.sub()b.super_sub()问题:以下程序访问的是父类还是子类?《要点》:1)被隐藏的父类域在子类对象中仍占有独立的内存空间;2)子类可通过super关键字或继承自父类的方法访问或处理继承自父类的域。方法的继承与覆盖1.继承:子类可继承父类的所有非私有方法;2.覆盖(Override):子类重新定义与父类同名的方法(指非静态方法,要求方法名、返回值和参数列表完全相同);如果子类的非抽象方法覆盖了父类的抽象方法,称子类“实现”了父类的抽象方法。1.abstractclassA{2.doublem_a;3.abstractdoublesub();4.doubleget()5.{returnm_a;}}6.classBextendsA{7.doublem_a;8.doublesub()9.{m_a-=1;returnm_a;}10.doublesuper_sub()11.{super.m_a-=1;returnsuper.m_a;}12.doubleget()13.{returnm_a;}}//测试publicclassApplication1{publicstaticvoidmain(String[]args){Bb=newB();b.m_a=100;System.out.println(b.get());}输出为:100《例》域的隐藏、方法覆盖、方法重载classPoint{//父类intx=0,y=0;voidmove(intdx,intdy){x+=dx;y+=dy;}}classRealPointextendsPoint{//子类floatx=0.0f,y=0.0f;//域的隐藏voidmove(intdx,intdy)//方法的覆盖{System.out.println(subclass'smove);move((float)dx,(float)dy);}voidmove(floatdx,floatdy)//方法的重载{x+=dx;y+=dy;}}1.publicclassApplication1{2.publicstaticvoidmain(String[]args){3.RealPointrp=newRealPoint();4.System.out.println(x:+rp.x+y:+rp.y);5.rp.move(1,1);6.System.out.println(x:+rp.x+y:+rp.y);7.}8.}输出:x:0.0y:0.0subclass'smovex:1.0y:1.0this对当前对象的引用;作用:1)调用当前对象的方法或域;如:classPoint{intx=0,y=0;voidmove(intx,inty){this.x+=x;this.y+=y;}}2)作为参数传递给其他对象或方法如:input.addActionListener(this);super对当前对象的父类对象的引用;作用:1)在构造函数定义中用super(参数列表)调用父类的构造函数;①publicclassappleextendsfruits②{publicapple(intprice)③{super(price);}④}2)用super.域名引用父类的域;《例5-5》testSuper.java(第100页)问题:第六行:my200.balance=50是访问的哪一个类的balance?第七行:my200.getBalance()是访问的父类还是子类的函数?访问的是父类还是子类的变量?1.classSuperClass2.{3.intx;4....5.}6.classSubClassextendsSuperClass7.{8.inty;9....10.}父类对象与子类对象的转换1.PublicclassUseSuperSub2.{3.SuperClasssc,sc_ref;4.SubClasssb,sb_ref;5.sc=newSuperClass();6.sb=newSubClass();7.sc_ref=sb;//对还是错?8.//父类引用可以指向子类对象;9.sb_ref=sc;//对还是错?10.//错,子类对象不能赋给父类引用;classSuperClass{intx;...}classSubClassextendsSuperClass{inty;...}11.inta=sc_ref.x;//对或错?12.//对,以子类对象作为实际参数访问父类变量;13.sb_ref=(SubClass)sc_ref;//对或错?14.//对,父类引用强制转换成子类引用;15.sb_ref=(SubClass)sc;//对或错?16.//编译通过,但接着用sb_ref.y则错;17.}classSuperClass{intx;...}classSubClassextendsSuperClass{inty;...}父类对象与子类对象的转换1)子类对象可以看作是其父类的对象;2)父类对象不能被当作是其某一个子类的对象;3)如果某个方法的形式参数是父类对象,可以使用子类对象作为实际参数;4)如果父类对象引用指向的实际是子类对象,可以采用强制类型转换将父类对象引用转化成子类对象引用;引例:函数功能:取绝对值(每一种类型对应一个函数)整数:inti_abs(inti);单精度:floatf_abs(floatf);双精度:doubled_abs(doubled);面向对象:Math.abs(inti);Math.abs(floatf);Math.abs(doubled);多态(polymophism)多态(polymophism)指的是一个程序(在同一个类或不同类中)包含多个名称相同、但功能或具体实现不同的方法;主要通过方法的覆盖(不同类)、重载(同一类)实现;电话卡域:剩余金额方法:拨打电话查询金额无卡号电话卡域:电话机型号方法:获得电话机型号有卡号电话卡域:卡号,密码,接入号码,接通方法:登录交换机IP卡域:有效时间方法:拨打电话200卡域:附加费用方法:拨打电话修改密码电话IC卡方法:拨打电话电话磁卡域:使用地域方法:拨打电话继承继承继承继承继承继承拨打电话函数在各子类中得到覆盖同一个类中定义多个同名的方法(条件:形式参数个数、类型和顺序不同);1.publicclassMyClass{2.publicstaticintabs(intp){3.returnMath.abs(p);}4.publicstaticlongabs(longp){5.returnMath.abs(p);}6.publicstaticdoubleabs(doublep){7.returnMath.abs(p);}8.}重载(overload)优点:1)提高程序的简洁性;2)通过接口操纵对象;P104/〈例5-6〉TestOverride.java问题:这个例子是重载还是覆盖?在哪两个函数体现?P51/booleanperformDial()P63/booleanperformDial(longcn,intpass)构造函数重载同一类中存在多个具有不同参数列表的构造函数;例:P107;(参数的数目、类型、顺序不同)例:P108;(构造函数的互相调用)目的:满足对象的不同初始化需求。构造函数继承子类构造函数总是先调用父类的构造函数;原则:1)子类继承父类无参构造函数;2)子类未显式地调用父类的构造函数,实则先调用父类的无参数构造函数;3)子类显示调用父类的带参数构造函数(第一句);设计总结不定义构造函数(缺省构造函数);定义构造函数,并调用父类的带参构造函数;D200_Card(longcn,intpass,doubleb,doublea){super(cn,pass,b);//必须是第一句additoryFee=a;}重载,实现多层次对象初始化;D200_Card(longcn,intpass,doublea)D200_Card(longcn,intpass,doubleb,doublea)P110/《例5-7》ConstructorOverride.java问题:共调用了几个构造函数?包package包名;〈例〉packageA;packageA.B;作用:默认的访问规则:在同一程序包中出现的类才可以直接使用它的数据和方法。组织和管理文件的方式:用以存放该包中所有类文件(.Class);包的引用1)使用包名、类名前缀如:classmyAppletextendsjava.applet.Applet;java.awt.Buttonbtn=newjava.awt.Button(“启动”);注:此方式是完整引用形式,但程序书写不简洁;2)加载需要使用的类(以后的程序可采用省略的书写方式)如:importjava.applet.Applet;classmyAppletextendsApplet;3)加载整个包如:importjava.applet.*;假设有两个类:java.awt.Button、java.sw.Button;java.awt.Buttonbtn=
本文标题:Java_语言与面向对象程序设计(第二版)课件第五章
链接地址:https://www.777doc.com/doc-5835267 .html