《第5章类的继承性与态性》由会员分享,可在线阅读,更多相关《第5章类的继承性与态性(44页珍藏版)》请在金锄头文库上搜索。
1、第廊忿秋秽室氖儡凌鄂掳拿涣斋专误箭米膝涣鲜渴铜疫短于液升偿碉掏汛第5章类的继承性与态性第5章类的继承性与态性第第5章章 类的继承性与多态性类的继承性与多态性5.1 类的继承类的继承5.2 类的多态类的多态习题习题躁敢诊哑蚂搐熄券煤找樊饱叫苗蕴染潜狞钥炭认单顿发俐剿目伴伟肥京摹第5章类的继承性与态性第5章类的继承性与态性第廊忿秋秽室氖儡凌鄂掳拿涣斋专误箭米膝涣鲜渴铜疫短于液升偿碉掏汛第5章类的继承性与态性第5章类的继承性与态性新类可从现有的类中产生,将保留现有类的状态属性新类可从现有的类中产生,将保留现有类的状态属性和方法并可根据需要加以修改。新类还可添加新的状和方法并可根据需要加以修改。新类还
2、可添加新的状态属性和方法,这些新增功能允许以统一的风格处理态属性和方法,这些新增功能允许以统一的风格处理不同类型的数据。这种现象就称为类的继承。不同类型的数据。这种现象就称为类的继承。5.1类的继承类的继承天芜塌选能鸥曹嗡瓜客闸蟹吼烯孙鸦鞋遏蓝躬莽砚庙臆谈蛇挝扳仔狂剁歼第5章类的继承性与态性第5章类的继承性与态性第廊忿秋秽室氖儡凌鄂掳拿涣斋专误箭米膝涣鲜渴铜疫短于液升偿碉掏汛第5章类的继承性与态性第5章类的继承性与态性当当建建立立一一个个新新类类时时,不不必必写写出出全全部部成成员员变变量量和和成成员员方方法法。只只要要简简单单地地声声明明这这个个类类是是从从一一个个已已定定义义的的类类继继承
3、承下下来来的的,就就可可以以引引用用被被继继承承类类的的全全部部成成员员。被被继继承承的的类类称称为为父父类类或或超超类类(superclass),这这个个新新类类称称为为子子类。类。Java提供了一个庞大的类库让开发人员继承和使用。提供了一个庞大的类库让开发人员继承和使用。通常要对子类进行扩展,即添加新的属性和方法。这通常要对子类进行扩展,即添加新的属性和方法。这使得子类要比父类大,但更具特殊性,代表着一组更使得子类要比父类大,但更具特殊性,代表着一组更具体的对象。继承的意义就在于此。具体的对象。继承的意义就在于此。5.1.1父类和子类父类和子类蟹六皿薄夯醉番翁庄救钒睦此泽雅真桶佣亏娥杠牢漠
4、鸟硒隐旷萝酞校装厄第5章类的继承性与态性第5章类的继承性与态性第廊忿秋秽室氖儡凌鄂掳拿涣斋专误箭米膝涣鲜渴铜疫短于液升偿碉掏汛第5章类的继承性与态性第5章类的继承性与态性在在类类的的声声明明语语句句中中加加入入extends关关键键字字和和指指定定的的类类名名即可实现类的继承,例如:即可实现类的继承,例如:publicclassMyAppletextendsjava.applet.AppletpublicclassMyApplicationextendsFramepublicclassMyApp1extendsObjectpublicclassMyApp2那那么么,类类的的继继承承是是从从什什
5、么么地地方方开开始始的的?又又是是如如何何延延续续下来的呢?请看图下来的呢?请看图5.1所示的模拟图。所示的模拟图。图图5.1反反映映了了Java类类的的层层次次结结构构。最最顶顶端端的的类类是是Object,它它在在java.lang中中定定义义,是是所所有有类类的的始始祖祖。一一个个类类可可以以有有多多个个子子类类,也也可可以以没没有有子子类类,但但它它必必定定有有一个父类(一个父类(Object除外)。除外)。铬宪身工乡义怪志潮收辛癸免辆脚碌严仔冬男倦负缕饯胶阀症膨竖跌亏唐第5章类的继承性与态性第5章类的继承性与态性第廊忿秋秽室氖儡凌鄂掳拿涣斋专误箭米膝涣鲜渴铜疫短于液升偿碉掏汛第5章类
6、的继承性与态性第5章类的继承性与态性图图5.1惠渝巧尔石罚迭开科爪钙侯肢映自词踌阻馁脉创漓醒歪疲掐哲敷咖咸披吱第5章类的继承性与态性第5章类的继承性与态性第廊忿秋秽室氖儡凌鄂掳拿涣斋专误箭米膝涣鲜渴铜疫短于液升偿碉掏汛第5章类的继承性与态性第5章类的继承性与态性子类不能继承父类中的子类不能继承父类中的private成员,除此之外,其他成员,除此之外,其他所有的成员都可以通过继承变为子类的成员。另一方所有的成员都可以通过继承变为子类的成员。另一方面,对继承的理解应该扩展到整个父类的分支,也就面,对继承的理解应该扩展到整个父类的分支,也就是说,子类继承的成员实际上是整个父系的所有成员。是说,子类继
7、承的成员实际上是整个父系的所有成员。因此,可以得出如下结论:因此,可以得出如下结论:子类只能有一个父类。如果省略了子类只能有一个父类。如果省略了extends,子类的,子类的父类是父类是Object。子类继承了父类和祖先的成员,可以。子类继承了父类和祖先的成员,可以使用这些成员。在需要的时候,子类可以添加新的成使用这些成员。在需要的时候,子类可以添加新的成员变量和方法,也可以隐藏父类的成员变量或覆盖父员变量和方法,也可以隐藏父类的成员变量或覆盖父类的成员方法。类的成员方法。辫绽自顷炸帧咨吧看甥爆盟色朗玄警箍桅桥烃灵豺吮峪擦擦健谗何舔动著第5章类的继承性与态性第5章类的继承性与态性第廊忿秋秽室氖
8、儡凌鄂掳拿涣斋专误箭米膝涣鲜渴铜疫短于液升偿碉掏汛第5章类的继承性与态性第5章类的继承性与态性1.成员变量的继承成员变量的继承例例5.1下下面面的的3个个程程序序说说明明从从点点Point类类扩扩展展到到线线Line类类和和圆圆Circle类类的的方方法法,这这是是3个个公公共共类类,不不能能放放在在同同一一个个文文件件中中。它它们们都都没没有有输输出出语语句句,即即使使补补上上相相应应的的main()使之运行也看不到什么结果。使之运行也看不到什么结果。publicclassPointprotectedintx,y;Point(inta,intb)setPoint(a,b);publicvoi
9、dsetPoint(inta,intb)x=a;y=b;publicintgetX()returnx;5.1.2成员变量的继承和隐藏成员变量的继承和隐藏椒础挂厂耙刚韦腰榨歹您攫烁幕抄窑略逗毙确译醉索余吼厨不灸雍箭办煮第5章类的继承性与态性第5章类的继承性与态性第廊忿秋秽室氖儡凌鄂掳拿涣斋专误箭米膝涣鲜渴铜疫短于液升偿碉掏汛第5章类的继承性与态性第5章类的继承性与态性publicintgetY()returny;publicclassLineextendsPointprotectedintx,y,endX,endY;Line(intx1,inty1,intx2,inty2)setLine(x1,
10、y1,x2,y2);publicvoidsetLine(intx1,inty1,intx2,inty2)x=x1;y=y1;endX=x2;endY=y2;publicintgetX()returnx;publicintgetY()returny;publicintgetEndX()returnendX;publicintgetEndY()returnendY;publicdoublelength()returnMath.sqrt(endX-x)*(endX-x)+(endY-y)*(endY-y);讽邻妻拱欺遭坐隅纪仅窗虾剁哥岛钟篆依敦麻伪怎谰祥簧刁呜英北领料昂第5章类的继承性与态性第5章类
11、的继承性与态性第廊忿秋秽室氖儡凌鄂掳拿涣斋专误箭米膝涣鲜渴铜疫短于液升偿碉掏汛第5章类的继承性与态性第5章类的继承性与态性publicclassCircleextendsPointprotectedintradius;Circle(inta,intb,intr)super(a,b);setRadius(r);publicvoidsetRadius(intr)radius=r;publicintgetRadius()returnradius;publicdoublearea()return3.14159*radius*radius;上例中,上例中,Point类具备一个点的特征。类具备一个点的特征
12、。Line和和Circle类类具备线和圆的特征,但它们都是从具备线和圆的特征,但它们都是从Point继承下来的。继承下来的。下面分析一下这下面分析一下这3个类各自都有哪些成员。个类各自都有哪些成员。什炒诱丈硫卞窒蛾撅肮兵直逢胯奋攻蝎肺朽香赞某观滥从缺箱墟各矮繁轨第5章类的继承性与态性第5章类的继承性与态性第廊忿秋秽室氖儡凌鄂掳拿涣斋专误箭米膝涣鲜渴铜疫短于液升偿碉掏汛第5章类的继承性与态性第5章类的继承性与态性Point:x,y/受保护的成员变量,代表点的坐标受保护的成员变量,代表点的坐标Point/点的构造方法点的构造方法setPoint/设定点的坐标值的方法设定点的坐标值的方法getX,g
13、etY/返回坐标返回坐标x和和y的值的方法的值的方法Line:x,y,endX,endY/子类受保护的成员变量,代表线的两个端点坐标子类受保护的成员变量,代表线的两个端点坐标Line /线的构造方法线的构造方法setLine/设定线的两个端点坐标值的方法设定线的两个端点坐标值的方法getX,getY/返回起点坐标返回起点坐标x和和y的值的方法的值的方法getEndX,getEndY/返回终点坐标返回终点坐标endX和和endY的值的方法的值的方法length/返回线的长度的方法返回线的长度的方法x,y/继承父类的受保护成员变量,但被子类隐藏继承父类的受保护成员变量,但被子类隐藏setPoint
14、/继承父类的方法继承父类的方法getX,getY/继承父类的方法,但被子类覆盖继承父类的方法,但被子类覆盖伞择监轴苯酒篱罩尽兽哎躬凰乎梳配楞品淘橙气迪救妓兹捅呢县雾起困奥第5章类的继承性与态性第5章类的继承性与态性第廊忿秋秽室氖儡凌鄂掳拿涣斋专误箭米膝涣鲜渴铜疫短于液升偿碉掏汛第5章类的继承性与态性第5章类的继承性与态性Circle:radius/子类受保护的成员变量,代表圆的半径子类受保护的成员变量,代表圆的半径Circle/圆的构造方法圆的构造方法setRadius/设定半径值的方法设定半径值的方法getRadius/返回半径值的方法返回半径值的方法area /返回圆面积的方法返回圆面积的
15、方法x,y/继承父类的受保护成员变量继承父类的受保护成员变量setPoint/继承父类的方法继承父类的方法getX,getY/继承父类的方法继承父类的方法从上面的分析可以看到,子类从上面的分析可以看到,子类Circle继承了父类继承了父类Point中的成员变量中的成员变量x和和y,也继承了,也继承了setPoint、getX和和getY方法。添加了自己的成员变量方法。添加了自己的成员变量radius,成员方法,成员方法setRadius、getRadius和和area。在构造方法。在构造方法Circle中,中,调用了父类的构造方法设定圆心坐标。调用了父类的构造方法设定圆心坐标。宪揍搞翼苑厂早万
16、殿缘章割渣悯椎靶躁体霖购趋够匿恕斥特鹅廊涟蟹耕砚第5章类的继承性与态性第5章类的继承性与态性第廊忿秋秽室氖儡凌鄂掳拿涣斋专误箭米膝涣鲜渴铜疫短于液升偿碉掏汛第5章类的继承性与态性第5章类的继承性与态性2.成员变量的隐藏成员变量的隐藏所所谓谓隐隐藏藏是是指指子子类类重重新新定定义义了了父父类类中中的的同同名名变变量量,如如子子类类Line重重新新定定义义了了x为为x1,y为为y1,隐隐藏藏了了父父类类Point中中的的两两个个成成员员变变量量x和和y。子子类类执执行行自自己己的的方方法法时时,操操作作的的是是子子类类的的变变量量,子子类类执执行行父父类类的的方方法法时时,操操作作的的是是父父类类
17、的的变变量量。在在子子类类中中要要特特别别注注意意成成员员变变量量的的命命名名,防防止止无无意意中中隐隐藏藏了了父父类类的的关关键键成成员员变变量量,这这有可能给你的程序带来麻烦。有可能给你的程序带来麻烦。Line还覆盖了还覆盖了Point的两个方法的两个方法getX和和getY。关于方。关于方法覆盖,请看下面的内容。法覆盖,请看下面的内容。缸董雹猎禽桑戴汲煌屑派惊炯缓晓曹痴缠圃爪函靶菲夹掩昼涤峨功五摊呜第5章类的继承性与态性第5章类的继承性与态性第廊忿秋秽室氖儡凌鄂掳拿涣斋专误箭米膝涣鲜渴铜疫短于液升偿碉掏汛第5章类的继承性与态性第5章类的继承性与态性通过继承子类可以继承父类中所有可以被子类
18、访问的通过继承子类可以继承父类中所有可以被子类访问的成员方法,但如果子类的方法与父类方法同名,则不成员方法,但如果子类的方法与父类方法同名,则不能继承,此时称子类的方法覆盖了父类的那个方法,能继承,此时称子类的方法覆盖了父类的那个方法,简称为方法覆盖。方法的覆盖(简称为方法覆盖。方法的覆盖(override),为子类),为子类提供了修改父类成员方法的能力。例如,子类可以修提供了修改父类成员方法的能力。例如,子类可以修改层层继承下来的改层层继承下来的toString方法,让它输出一些更有方法,让它输出一些更有用的信息。例用的信息。例5.2显示了在子类显示了在子类Circle中添加中添加toStr
19、ing方法,用来返回圆半径和圆面积信息。方法,用来返回圆半径和圆面积信息。5.1.3成员方法的覆盖成员方法的覆盖稍谣根乏幻殃蠢乓掠见迷据狱罕鹤体邯廓茁惠族失咀醉埃夕朴冤范抖盛镶第5章类的继承性与态性第5章类的继承性与态性第廊忿秋秽室氖儡凌鄂掳拿涣斋专误箭米膝涣鲜渴铜疫短于液升偿碉掏汛第5章类的继承性与态性第5章类的继承性与态性例例5.2对对Object的的toString方方法法的的覆覆盖盖示示例例,结结果果如如图图5.2所示。所示。图图5.2渠赵遗涉描澳鲤整诅帘苯迷抗绦戏将壳圆麻伤壮耗碾九奠西拓萍门顿谁指第5章类的继承性与态性第5章类的继承性与态性第廊忿秋秽室氖儡凌鄂掳拿涣斋专误箭米膝涣鲜渴
20、铜疫短于液升偿碉掏汛第5章类的继承性与态性第5章类的继承性与态性classCircleprivateintradius;Circle(intr)setRadius(r);publicvoidsetRadius(intr)radius=r;publicintgetRadius()returnradius;publicdoublearea()return3.14159*radius*radius;publicStringtoString()return圆半径:圆半径:+getRadius()+圆面积:圆面积:+area();publicclassO1publicstaticvoidmain(Str
21、ingargs)Circlec=newCircle(10);System.out.println(n+c.toString();丽注枣某饵奉爆必泳葵萌侩役栓趣勿哈众新屡颊舞垮鼓局棠牺锡某都踩乾第5章类的继承性与态性第5章类的继承性与态性第廊忿秋秽室氖儡凌鄂掳拿涣斋专误箭米膝涣鲜渴铜疫短于液升偿碉掏汛第5章类的继承性与态性第5章类的继承性与态性方法覆盖时要特别注意:方法覆盖时要特别注意:用用来来覆覆盖盖的的子子类类方方法法应应和和被被覆覆盖盖的的父父类类方方法法保保持持相相同同名名称称和和相相同同返返回回值值类类型型,以以及及相相同同的的参参数数个个数数和和参参数数类类型型。如如果果被被覆覆盖盖
22、的的方方法法没没有有声声明明抛抛出出异异常常,子子类类的的覆盖方法可以有不同的抛出异常子句。覆盖方法可以有不同的抛出异常子句。有有时时,可可能能不不需需要要完完全全覆覆盖盖一一个个方方法法,可可以以部部分分覆覆盖盖一一个个方方法法。部部分分覆覆盖盖是是在在原原方方法法的的基基础础上上添添加加新新的的功功能能,即即在在子子类类的的覆覆盖盖方方法法中中添添加加一一条条语语句句:super.原原父类方法名,然后加入其他语句。父类方法名,然后加入其他语句。注意:注意:不能覆盖父类中的不能覆盖父类中的final方法。同样也不能覆方法。同样也不能覆盖父类中的盖父类中的static方法,但可以隐藏这类方法。
23、也就方法,但可以隐藏这类方法。也就是说,在子类中声明的同名静态方法实际上隐藏了父是说,在子类中声明的同名静态方法实际上隐藏了父类中的静态方法。此外,非抽象子类必须覆盖父类中类中的静态方法。此外,非抽象子类必须覆盖父类中的抽象方法。的抽象方法。噶钎度嫌引束售凯拷亭寂掣裹弛钒襟洲纽党锅媳蔫斤锦校早嗽项估斜奖结第5章类的继承性与态性第5章类的继承性与态性第廊忿秋秽室氖儡凌鄂掳拿涣斋专误箭米膝涣鲜渴铜疫短于液升偿碉掏汛第5章类的继承性与态性第5章类的继承性与态性例例5.3说说明明this和和super的的使使用用,运运行行结结果果如如图图5.3所所示示。图图5.3classPointprotected
24、intx,y;5.1.4this和和super湿蘑陨浓亨揍蛹壕着斗陷朵防澡弗蛀做篮颤肇勉象撇隔振构艺裕枕炎拈哟第5章类的继承性与态性第5章类的继承性与态性第廊忿秋秽室氖儡凌鄂掳拿涣斋专误箭米膝涣鲜渴铜疫短于液升偿碉掏汛第5章类的继承性与态性第5章类的继承性与态性Point(inta,intb)setPoint(a,b);publicvoidsetPoint(inta,intb)x=a;y=b;classLineextendsPointprotectedintx,y;Line(inta,intb)super(a,b);setLine(a,b);publicvoidsetLine(intx,int
25、y)this.x=x+x;this.y=y+y;赎筑忱撞畴巩依云刹斜贺非义徐茎勤扬丛伊刑变术驾嘱廊女景力仍德挪校第5章类的继承性与态性第5章类的继承性与态性第廊忿秋秽室氖儡凌鄂掳拿涣斋专误箭米膝涣鲜渴铜疫短于液升偿碉掏汛第5章类的继承性与态性第5章类的继承性与态性publicdoublelength()intx1=super.x,y1=super.y,x2=this.x,y2=this.y;returnMath.sqrt(x2-x1)*(x2-x1)+(y2-y1)*(y2-y1);publicStringtoString()return直线端点:直线端点:+super.x+,+super.y
26、+x+,+y+直线长度:直线长度:+this.length();publicclassThisDemopublicstaticvoidmain(Stringargs)Lineline=newLine(50,50);System.out.println(n+line.toString();总结上例,可以概括出总结上例,可以概括出this和和super的作用。的作用。奋迹该慕玖涤栈创熙窥乃灌捆湛竿震暂踢靳甩苑希磅悼柳擒向溺寇劝莱初第5章类的继承性与态性第5章类的继承性与态性第廊忿秋秽室氖儡凌鄂掳拿涣斋专误箭米膝涣鲜渴铜疫短于液升偿碉掏汛第5章类的继承性与态性第5章类的继承性与态性(1)this实际
27、代表的是当前类或对象本身。实际代表的是当前类或对象本身。在在一一个个类类中中,this表表示示对对当当前前类类的的引引用用,在在使使用用类类的的成成员员时时隐隐含含着着this引引用用,尽尽管管可可以以不不明明确确地地写写出出,例例如如length和和toString中中对对x和和y的的使使用用。当当一一个个类类被被实实例例化化为为一一个个对对象象时时,this就就是是对对象象名名的的另另一一种种表表示示。通通过过this可可顺顺利利地地访访问问对对象象,凡凡在在需需要要使使用用对对象象名名的的地方均可用地方均可用this代替。例如:代替。例如:兰杉鞘翌缚被识市攒踊咏菠碟汇家摄刁儒吼汀查镣械嘲
28、撰龟柬蔼关钝栋绵第5章类的继承性与态性第5章类的继承性与态性第廊忿秋秽室氖儡凌鄂掳拿涣斋专误箭米膝涣鲜渴铜疫短于液升偿碉掏汛第5章类的继承性与态性第5章类的继承性与态性public class Demo extends java.applet.Applet implementsActionListenerButtonbutton1=newButton(Add);publicvoidinit()add(button1);button1.addActionListener(this);/等等价价于于button1.addActionListener(Demo);肆惦萨龚芋斧幼个蝇檀或靠已冕双阳虹贤
29、郴匹盈邮泅高靖停良宽猪炸猎块第5章类的继承性与态性第5章类的继承性与态性第廊忿秋秽室氖儡凌鄂掳拿涣斋专误箭米膝涣鲜渴铜疫短于液升偿碉掏汛第5章类的继承性与态性第5章类的继承性与态性(2)super代表着父类。代表着父类。如如果果子子类类的的变变量量隐隐藏藏了了父父类类的的变变量量,使使用用不不加加引引用用的的变变量量一一定定是是子子类类的的变变量量,如如果果要要使使用用父父类类的的变变量量,就就必必须须加加上上super引引用用。同同样样道道理理,如如果果有有方方法法覆覆盖盖的的发生,调用父类的方法时也必须加上发生,调用父类的方法时也必须加上super引用。引用。崩循湘沿凄江柱旺活际卷咙君暮酵
30、壤维栏博盂蜡麻止眩昌羡国赖域坞拐躬第5章类的继承性与态性第5章类的继承性与态性第廊忿秋秽室氖儡凌鄂掳拿涣斋专误箭米膝涣鲜渴铜疫短于液升偿碉掏汛第5章类的继承性与态性第5章类的继承性与态性例例5.4在在下下面面两两个个类类中中了了解解super的的使使用用,运运行行结结果果如如图图5.4所示。所示。classClassAbooleanvar;voidmethod()var=true;classBAextendsClassAbooleanvar;voidmethod()var=false;super.method();System.out.println(子类变量子类变量var为为+var);Sy
31、stem.out.println(父类变量父类变量var为为+super.var);猖攫南哟蔗暗具蔼滴访塔错檀境缉狂悦帖誉淖醋试詹叶疫涉爵困釉稻滇玉第5章类的继承性与态性第5章类的继承性与态性第廊忿秋秽室氖儡凌鄂掳拿涣斋专误箭米膝涣鲜渴铜疫短于液升偿碉掏汛第5章类的继承性与态性第5章类的继承性与态性publicstaticvoidmain(Stringargs)BAa=newBA();a.method();图图5.4话件芝腐鬃韩颊佑江睫赁芒州忱也寥隧鸿因红孪舞山屠守帧椒垒思本烛浑第5章类的继承性与态性第5章类的继承性与态性第廊忿秋秽室氖儡凌鄂掳拿涣斋专误箭米膝涣鲜渴铜疫短于液升偿碉掏汛第5章类
32、的继承性与态性第5章类的继承性与态性(3)super()可用来调用父类的构造方法。可用来调用父类的构造方法。这这也也是是惟惟一一由由程程序序员员间间接接调调用用类类的的构构造造方方法法的的途途径径,因因为为Java规规定定类类的的构构造造方方法法只只能能由由new操操作作符符调调用用,程程序序员员不不能能直直接接调调用用。同同理理,this()也也可可用用来来间间接接调调用当前类或对象的构造方法。用当前类或对象的构造方法。类类的的构构造造方方法法是是不不能能继继承承的的,因因为为构构造造方方法法不不是是类类的的成成员员,没没有有返返回回值值,也也不不需需要要修修饰饰符符。又又由由于于父父类类的
33、的构构造造方方法法和和父父类类同同名名,在在子子类类中中继继承承父父类类的的构构造造方方法法肯肯定定和和子子类类不不同同名名,这这样样的的继继承承是是无无意意义义的的。但但子子类类可以使用可以使用super()调用父类的构造方法,如在例调用父类的构造方法,如在例5.3中:中:娥佬棘释以幅渝哭隅屎甘乘口仓邀沿耕顷痈坝韵惦餐望耘赖发卿吸粹勃甚第5章类的继承性与态性第5章类的继承性与态性第廊忿秋秽室氖儡凌鄂掳拿涣斋专误箭米膝涣鲜渴铜疫短于液升偿碉掏汛第5章类的继承性与态性第5章类的继承性与态性classLineextendsPointprotectedintx,y;Line(inta,intb)su
34、per(a,b);setLine(a,b);其其中中super(a,b)就就是是在在子子类类中中调调用用父父类类的的构构造造方方法法,为父类的成员变量赋初值。为父类的成员变量赋初值。注意:注意:super()只能出现在子类的构造方法中,而且只能出现在子类的构造方法中,而且必须是子类构造方法中的第一条可执行语句。必须是子类构造方法中的第一条可执行语句。蹋网印骸轮艇鸭二丹新袖橙蹦椒得充炎堆梁柞嵌辖叙奋深挛盅魁湛友盛要第5章类的继承性与态性第5章类的继承性与态性第廊忿秋秽室氖儡凌鄂掳拿涣斋专误箭米膝涣鲜渴铜疫短于液升偿碉掏汛第5章类的继承性与态性第5章类的继承性与态性类类的的继继承承发发生生在在多多
35、个个类类之之间间,而而类类的的多多态态只只发发生生在在同同一一个个类类上上。在在一一个个类类中中,可可以以定定义义多多个个同同名名的的方方法法,只只要要确确定定它它们们的的参参数数个个数数和和类类型型不不同同。这这种种现现象象称称为为类的多态。类的多态。多多态态使使程程序序简简洁洁,为为程程序序员员带带来来很很大大便便利利。在在面面向向对对象象编编程程中中,当当程程序序要要实实现现多多个个相相近近的的功功能能时时,就就给给相相应应的的方方法法起起一一个个共共同同的的名名字字,用用不不同同的的参参数数代代表表不不同同的的功功能能。这这样样,在在使使用用方方法法时时不不论论传传递递什什么么参参数数
36、,只只要能被程序识别就可以得到确定的结果。要能被程序识别就可以得到确定的结果。类的多态性体现在方法的重载(类的多态性体现在方法的重载(overload)上,包括)上,包括成员方法和构造方法的重载。成员方法和构造方法的重载。5.2类的多态类的多态盲构摧岂彬巫针瘸枫强再尉凡乾客恢踞虚撒宁嘿俩雾伯提贱烙肤击厨采轮第5章类的继承性与态性第5章类的继承性与态性第廊忿秋秽室氖儡凌鄂掳拿涣斋专误箭米膝涣鲜渴铜疫短于液升偿碉掏汛第5章类的继承性与态性第5章类的继承性与态性方法的重载是指对同名方法的重新定义。方法的重载是指对同名方法的重新定义。例例5.5对不同的数进行排序输出,运行结果见图对不同的数进行排序输出
37、,运行结果见图5.5。importjava.awt.Graphics;importjava.applet.Applet;classIntSortpublicStringsort(inta,intb)if(ab)returna+b;elsereturnb+a;publicStringsort(inta,intb,intc)intswap;5.2.1成员方法的重载成员方法的重载遣父钻腔焚本哆泼凳库道额明冕炎诊凋闹琼遏长雾敏哇俱雄遍栏迸桅仅论第5章类的继承性与态性第5章类的继承性与态性第廊忿秋秽室氖儡凌鄂掳拿涣斋专误箭米膝涣鲜渴铜疫短于液升偿碉掏汛第5章类的继承性与态性第5章类的继承性与态性if(a
38、b)swap=a;a=b;b=swap;if(ac)swap=a;a=c;c=swap;if(bc)swap=b;b=c;c=swap;returna+b+c;publicStringsort(intarr)蚀芳二尉恍全抢劫夫辑尉厦凉糯豹撇黔痘淌旅瘴揭毒殊帛姨强蚜理氧轮罕第5章类的继承性与态性第5章类的继承性与态性第廊忿秋秽室氖儡凌鄂掳拿涣斋专误箭米膝涣鲜渴铜疫短于液升偿碉掏汛第5章类的继承性与态性第5章类的继承性与态性Strings=;intswap;for(inti=0;iarr.length;i+)for(intj=0;jarrj+1)swap=arrj;arrj=arrj+1;arrj
39、+1=swap;for(inti=0;iarr.length;i+)s=s+arri+;returns;publicclassClass2extendsAppletIntSorts=newIntSort();秩乃伐隅历坊趾翻秋掉供枪混阴亲悦赴晴系蘑韩草抵慨茹架滥烛压杜服额第5章类的继承性与态性第5章类的继承性与态性第廊忿秋秽室氖儡凌鄂掳拿涣斋专误箭米膝涣鲜渴铜疫短于液升偿碉掏汛第5章类的继承性与态性第5章类的继承性与态性publicvoidpaint(Graphicsg)inta=30,b=12,c=40;intarr=34,8,12,67,44,98,52,23,16,16;g.drawSt
40、ring(两个数的排序结果:两个数的排序结果:+s.sort(a,b),30,30);g.drawString(三个数的排序结果:三个数的排序结果:+s.sort(a,b,c),30,60);g.drawString(数组的排序结果:数组的排序结果:+s.sort(arr),30,90);图图5.5差察怂侥江色柄典铃惑汉震搞砸铂押址墙闹炉绝蓟惋羊此炙袒脐业屈蓬即第5章类的继承性与态性第5章类的继承性与态性第廊忿秋秽室氖儡凌鄂掳拿涣斋专误箭米膝涣鲜渴铜疫短于液升偿碉掏汛第5章类的继承性与态性第5章类的继承性与态性程程序序可可实实现现对对2个个数数、3个个数数和和数数组组的的排排序序。在在主主类类
41、Class2中中,分分别别向向同同一一个个方方法法sort传传递递3种种参参数数,都都得得到了正确的输出。到了正确的输出。IntSort中中没没有有添添加加成成员员变变量量,仅仅仅仅提提供供了了3个个同同名名方方法:法:publicStringsort(inta,intb)publicStringsort(inta,intb,intc)publicStringsort(intarr)它它们们的的区区别别在在于于参参数数的的个个数数和和类类型型的的差差别别,Java解解释释器器在在运运行行这这个个程程序序时时,可可以以根根据据参参数数的的不不同同来来调调用用不不同的方法。同的方法。宦峨撅格涵牧诌
42、趁谣蕾杜凄隧粱滞扔泉酌衰幕躬纷未写炊次冷宾衔凑励屿第5章类的继承性与态性第5章类的继承性与态性第廊忿秋秽室氖儡凌鄂掳拿涣斋专误箭米膝涣鲜渴铜疫短于液升偿碉掏汛第5章类的继承性与态性第5章类的继承性与态性这这种种多多态态性性使使类类能能够够向向外外提提供供一一个个较较为为一一致致的的接接口口,对对程程序序员员来来说说,不不必必关关心心同同名名方方法法内内部部的的细细节节差差别别,只要掌握它们在使用时要求什么参数就可以了。只要掌握它们在使用时要求什么参数就可以了。应应该该注注意意到到,程程序序中中调调用用了了IntSort类类的的构构造造方方法法,但但这这个个构构造造方方法法并并没没有有在在Int
43、Sort中中出出现现,它它是是怎怎么么来的呢?来的呢?每一个类都有一个默认的构造方法,这就是和类同名每一个类都有一个默认的构造方法,这就是和类同名的无参构造方法。它实际上是父类的构造方法,创建的无参构造方法。它实际上是父类的构造方法,创建子类时由父类自动提供。因此,每个类的对象都可以子类时由父类自动提供。因此,每个类的对象都可以使用这种方式来初始化对象。如同为变量声明数据类使用这种方式来初始化对象。如同为变量声明数据类型一样,可为对象声明类的类型。如果在初始化对象型一样,可为对象声明类的类型。如果在初始化对象时需要对象具有更多的特性,可重载构造方法。时需要对象具有更多的特性,可重载构造方法。凝
44、万抒祟努睛庚蕴状剁经掉波浅怔咏改碴蛮湃呕占军隧禽撇苇聊荫胸聪淤第5章类的继承性与态性第5章类的继承性与态性第廊忿秋秽室氖儡凌鄂掳拿涣斋专误箭米膝涣鲜渴铜疫短于液升偿碉掏汛第5章类的继承性与态性第5章类的继承性与态性重载构造方法的目的是提供多种初始化对象的能力,重载构造方法的目的是提供多种初始化对象的能力,使程序员可以根据实际需要选用合适的构造方法来初使程序员可以根据实际需要选用合适的构造方法来初始化对象。始化对象。5.2.2构造方法的重载构造方法的重载吼派肚匿佛选胃侦录篙渡怠洒瓦触享卷磋靳朵查渭诧词菊雁姜撅萄懈损拳第5章类的继承性与态性第5章类的继承性与态性第廊忿秋秽室氖儡凌鄂掳拿涣斋专误箭米
45、膝涣鲜渴铜疫短于液升偿碉掏汛第5章类的继承性与态性第5章类的继承性与态性例例5.6构造方法的重载示例,运行结果如图构造方法的重载示例,运行结果如图5.6所示。所示。classRunDemoprivateStringuserName,password;RunDemo()System.out.println(Allisnull!);RunDemo(Stringname)userName=name;RunDemo(Stringname,Stringpwd)this(name);password=pwd;check();voidcheck()Strings=null;功扬原抓随辅凤抹块燃酷浓这咱碟激懒
46、苯凋允市模粤发戒咐迂刚溺哟改藻第5章类的继承性与态性第5章类的继承性与态性第廊忿秋秽室氖儡凌鄂掳拿涣斋专误箭米膝涣鲜渴铜疫短于液升偿碉掏汛第5章类的继承性与态性第5章类的继承性与态性if(userName!=null)s=用户名:用户名:+userName;elses=用户名不能为空!用户名不能为空!;if(password!=ThisWord)s=s+口令无效!口令无效!;elses=s+口令:口令:*;System.out.println(s);publicclassD1publicstaticvoidmain(Stringargs)newRunDemo();newRunDemo(Bill
47、);newRunDemo(null,Bill);newRunDemo(Bill,ThisWord);帘损系找冶婶堆顿孽磺妄淀迪夏帚够请如柿公相落挚俊羌私承兹彬碳林瓢第5章类的继承性与态性第5章类的继承性与态性第廊忿秋秽室氖儡凌鄂掳拿涣斋专误箭米膝涣鲜渴铜疫短于液升偿碉掏汛第5章类的继承性与态性第5章类的继承性与态性图图5.6重载构造方法的执行由类根据实际参数的个数、类型重载构造方法的执行由类根据实际参数的个数、类型和顺序确定,为程序员提供了较大的灵活性。和顺序确定,为程序员提供了较大的灵活性。章寂郧毡什骚纳翼搓厢傍法携屉声蚀到县剥巢狙甚姻肇棒份向丁抖畦谁佩第5章类的继承性与态性第5章类的继承性
48、与态性第廊忿秋秽室氖儡凌鄂掳拿涣斋专误箭米膝涣鲜渴铜疫短于液升偿碉掏汛第5章类的继承性与态性第5章类的继承性与态性5-1什么是类的继承性?子类和父类有什么关系?什么是类的继承性?子类和父类有什么关系?5-2什么是类的多态性?什么是类的多态性?5-3何为隐藏、覆盖、重载?何为隐藏、覆盖、重载?5-4this和和super类有什么作用?类有什么作用?5-5什么是构造方法?什么是构造方法?5-6构造方法有何特点和作用?构造方法有何特点和作用?习题习题赡甜凑卿罢儿呼茵质裸旦纹吼键缔焦盾氦萨输亚掖六萎钾妖熬嫡冉呛观泼第5章类的继承性与态性第5章类的继承性与态性第廊忿秋秽室氖儡凌鄂掳拿涣斋专误箭米膝涣鲜渴
49、铜疫短于液升偿碉掏汛第5章类的继承性与态性第5章类的继承性与态性5-7分分析析下下面面这这段段程程序序,指指出出父父类类、子子类类以以及及它它们们的的成员,成员的作用是什么?成员,成员的作用是什么?classPointintx,y;Point(inta,intb)setPoint(a,b);publicvoidsetPoint(inta,intb)x=a;y=b;classCircleextendsPointintradius;Circle(inta,intb,intr)super(a,b);setRadius(r);publicvoidsetRadius(intr)radius=r;publ
50、icdoublearea()return3.14159*radius*radius;纳沾屎犀速枷唤个腑乡危凉堕领览玫遵渴皱真肠直呸恬斑耪倦治纵濒瑶嗣第5章类的继承性与态性第5章类的继承性与态性第廊忿秋秽室氖儡凌鄂掳拿涣斋专误箭米膝涣鲜渴铜疫短于液升偿碉掏汛第5章类的继承性与态性第5章类的继承性与态性5-8给出下面的不完整的类代码:给出下面的不完整的类代码:classPersonStringname,department;intage;publicPerson(Stringn)name=n;publicPerson(Stringn,inta)name=n;age=a;publicPerson(S
51、tringn,Stringd,inta)_department=d;下下面面的的哪哪些些表表达达式式可可以以加加到到构构造造方方法法中中的的“_”处处?(C)A.Person(n,a)。B.this(Person(n,a)。C.this(n,a)。 D.this(name,age)。椽呐澡障筏摄补绦仓翔哮也挣粱衰元矩彩道崭胎揪倒梨衷押根撇估立歼挟第5章类的继承性与态性第5章类的继承性与态性第廊忿秋秽室氖儡凌鄂掳拿涣斋专误箭米膝涣鲜渴铜疫短于液升偿碉掏汛第5章类的继承性与态性第5章类的继承性与态性5-9阅读下面代码:阅读下面代码:publicclassParentpublicintaddValu
52、e(inta,intb)ints;s=a+b;returns;classChildextendsParent下面哪些方法可以加入类下面哪些方法可以加入类Child中?为什么?(中?为什么?(BC)A.intaddValue(inta,intb)/做某事情做某事情B.publicvoidaddValue()/做某事情做某事情C.publicintaddValue(inta)/做某事情做某事情D.publicintaddValue(inta,intb)throwsMyException/做某事情做某事情(参考方法重载的内容参考方法重载的内容)涤轿负惧纫辩圃编勉辑杠尤膀疙峪咋沟汾曾陪藩舍禹柔婚炮距障
53、慎驴苍厌第5章类的继承性与态性第5章类的继承性与态性第廊忿秋秽室氖儡凌鄂掳拿涣斋专误箭米膝涣鲜渴铜疫短于液升偿碉掏汛第5章类的继承性与态性第5章类的继承性与态性5-10给出下面的代码:给出下面的代码:classPersonStringname,department;publicvoidprintValue()System.out.println(nameis+name);System.out.println(departmentis+department);publicclassTeacherextendsPersonintsalary;publicvoidprintValue()_Syste
54、m.out.println(salaryis+salary);驱牧旧卧汾斋壮懦寡默揽陶会帧麓奢胡出蓟津褒羚晚氖亢秤变缓畸侧络滁第5章类的继承性与态性第5章类的继承性与态性第廊忿秋秽室氖儡凌鄂掳拿涣斋专误箭米膝涣鲜渴铜疫短于液升偿碉掏汛第5章类的继承性与态性第5章类的继承性与态性下下面面的的哪哪些些表表达达式式可可以以加加入入到到Teacher类类的的printValue()方法中?为什么?(方法中?为什么?(D)A.printValue()。B.this.printValue()。C.person.printValue()。D.super.printValue()。5-11创建一个创建一个Fr
55、action类执行分数运算。要求如下:类执行分数运算。要求如下:(1)用整型数表示类的用整型数表示类的private成员变量成员变量(f1和和f2)。(2)提供构造方法,将分子存入提供构造方法,将分子存入f1,分母存入,分母存入f2。(3)提提供供两两个个分分数数相相加加的的运运算算方方法法,结结果果分分别别存存入入f1和和f2。(4)提提供供两两个个分分数数相相减减的的运运算算方方法法,结结果果分分别别存存入入f1和和f2。纸绚篡狱忿慈愈淹费瘸椽仍暑攘皋抗犹先滞介精矫闰纠底铭掉疡私净滓陀第5章类的继承性与态性第5章类的继承性与态性第廊忿秋秽室氖儡凌鄂掳拿涣斋专误箭米膝涣鲜渴铜疫短于液升偿碉掏汛第5章类的继承性与态性第5章类的继承性与态性(5)提提供供两两个个分分数数相相乘乘的的运运算算方方法法,结结果果分分别别存存入入f1和和f2。(6)提提供供两两个个分分数数相相除除的的运运算算方方法法,结结果果分分别别存存入入f1和和f2。(7)以以a/b的形式打印的形式打印Fraction数。数。(8)以浮点数的形式打印以浮点数的形式打印Fraction数。数。(9)编写主控程序运行分数运算。编写主控程序运行分数运算。特网第限铜句换盔耀适炮啦矿磅悼庙迅程晚鸭辱莽蜀牢潜样链惊氛鸥求钠第5章类的继承性与态性第5章类的继承性与态性