《类继承多态》PPT课件.ppt

上传人:wuy****n92 文档编号:69965933 上传时间:2023-01-13 格式:PPT 页数:44 大小:280.49KB
返回 下载 相关 举报
《类继承多态》PPT课件.ppt_第1页
第1页 / 共44页
《类继承多态》PPT课件.ppt_第2页
第2页 / 共44页
点击查看更多>>
资源描述

《《类继承多态》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《类继承多态》PPT课件.ppt(44页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、JAVA语言程序设计语言程序设计面向对象的程序设计第三章第三章 类类1Sept.2009ConfidentialJNRPJNRP2/43作业问题:类的成员是类对象(p145 1,3)MyRecttangleint xUp,yUpInt xDown,yDownMyRecttangle()MyRecttangle(int xUp,.)getW()getH()area();toString()MyCubeMyRecttangle rectint dMyCube(MyRecttangle rect,int d)getVolume();getSurfaceArea();2Sept.2009Confide

2、ntialJNRPJNRP4/43目标继承多态抽象类、抽象方法4Sept.2009ConfidentialJNRPJNRP5/43一、类的继承nJava 最令人心动的特性就是它的代码复用了。n代码复用有两种方式1、类的包含关系、类的包含关系l当一个类定义中包含另一个类的实例时,就是类的包含关系,通常称为“HAS-A(拥有A)”。2、类的继承关系、类的继承关系l在面向对象的程序设计中,“IS-A”称为继承关系。5Sept.2009ConfidentialJNRPJNRP6/43HAS-A汽车汽车发动机发动机 车轮车轮 方向盘方向盘IS-A水果水果苹果苹果梨梨香蕉苹果香蕉苹果富士苹果富士苹果6Se

3、pt.2009ConfidentialJNRPJNRP7/43n继承(Inheritance)指一个类(Class)可以继承其它类的所有内容,包括变量和方法。被继承的类称为父类父类或者超类超类(Superclass),继承后产生的类成为子类子类或者派生类派生类(Subclass)。7Sept.2009ConfidentialJNRPJNRP8/43n继承(Inheritance)利用extends创建子类修饰符 class 子类名 extends 父类名 语句体不使用extends的继承l如果没有使用extends,则该类为 的子类l注意:在Java语言中,所有的类都是由Object类派生出来

4、的,比如前面介绍的String类,以及用户自己新建的类。表示继承关系表示继承关系8Sept.2009ConfidentialJNRPJNRP9/43n继承注意事项:Java中,每一个类只可以有一个父类每一个类只可以有一个父类,即单继承;l一个类可以有多个子类。l父类含有其所有子类共同的内容,l每一个子类各自具有与其他子类不相同的内容。l子类可以添加自己的成员变量和方法一、一、类的继承类的继承Emoloyee类:name sexWorker类:category dressAllowanceOfficer类:empClass vehicle工人类,继承了父工人类,继承了父类的姓名和性别属类的姓名和

5、性别属性外还包含类别和性外还包含类别和是否有服装津贴属性是否有服装津贴属性主任类,还包含主任类,还包含级别和是否配备级别和是否配备交通工具属性交通工具属性职员类,具职员类,具有姓名和性有姓名和性别两个属性别两个属性9Sept.2009ConfidentialJNRPJNRP10/43n继承中的访问权限如果父类中的变量和方法为public、protected,其子类中的这些变量和方法依然为public、protected子类不能访问父类中权限为private的实例变量和实例方法例class_extend_exsampleextend_exmanagerTestSuperTestSuper.jav

6、a(Empolyee.java,Manager.java)10Sept.2009ConfidentialJNRPJNRP11/43n继承的访问权限:继承的访问权限:同一个类 同一个包 子类 全局private y default y yprotected y y ypublic y y y y一、一、类的继承类的继承11Sept.2009ConfidentialJNRPJNRP12/43n类继承的传递性类继承具有传递性,也就是说子类具有其父类和父类的父类,一直到Object类的所有类的内容。l比如,B类继承了A类,而C类又继承了B类,则C类包含A类和B类的几乎所有内容。父类成员变量的隐藏和方法

7、的覆盖12Sept.2009ConfidentialJNRPJNRP13/43n子类中父类成员变量的隐藏:子类的成员变量与父类的成员变量同名,则在子类中父类中的成员变量被隐藏,当子类中的变量名与父类的相同,原来的变量被遮盖;可使用super.变量名引用父类变量例class_extend_exsampleextend_exmanagerThreeClass.java13Sept.2009ConfidentialJNRPJNRP14/43n方法覆盖(overriding):子类中定义的方法和祖先类中某个方法同名,同参数行,(即子类可以改写父类方法所实现的功能),则父类中的该方法被覆盖。子类可使用s

8、uper.方法名引用父类方法。子类中重写的方法必须与父类方法有:相同的名字、相同的参数表、相同的返回类型。14Sept.2009ConfidentialJNRPJNRP15/43实例:extend_exsampleextend_ex 类的UML图nprotected:被子类及同一个包内的 点(坐标x,y)其他类访问 圆(圆心、半径)TestMyCircleMain()一、一、类的继承类的继承setRadius();getRadius();getArea();toString();MyPointprotected int xprotected int ysetX();getx();setY();

9、getY();toString()MyCircleprotected int radiusMyCircle()MyCircle(x,y,radius)15Sept.2009ConfidentialJNRPJNRP16/43n例如父类:MyPoint类 public String toString()return(+x+,+y+);子类Mycirle覆盖父类的toString()方法;public String toString()return 圆心+super.toString()+;半径:+radius;/return 圆心+(+x+,+y+)+;半径:+radius;一、一、类的继承类的继

10、承16Sept.2009ConfidentialJNRPJNRP17/43区分:方法重载、方法覆盖n方法的覆盖(overriding)和重载(overloading)方法的覆盖:子孙类中定义的方法和祖先类中某个方法同名,同参数行,则祖先类中的该方法被覆盖.方法的重载:指一个对象的多态性,即多个方法用相同的名称,但参数行不同.类类void show(int int_num)void show(double double_num)void show(nit nit_ um,float float_um)1231.23123,1.2317Sept.2009ConfidentialJNRPJNRP18

11、/43usuper:表示父类对象。p122u何时使用?若子类的成员变量(或方法)名与父类的成员变量(方法)名字相同时,可使用super指明父类的成员变量或方法。u使用方法(1)访问被子类隐藏的父类中的成员变量 super.成员变量(2)调用被子类覆盖的父类中的成员方法 super.成员方法(3)调用直接基类的构造方法 super(参数)一、一、类的继承类的继承_ _supersuper关键字 super 18Sept.2009ConfidentialJNRPJNRP19/43例:extend_exsampleextend_exsetRadius();getRadius();area();toS

12、tring();MyPointprotected int xprotected int ysetX();getX();setY();getY();toString()MyCircleprotected int radiusMyCircle()MyCircle(x,y,radius)MySphereprotected int zsetZ();getZ();area();volumn();toString();MySphere()MySphere(x,y,z,radius)MyPoint()MyPoint(x,y)覆盖父类的方法toString()。覆盖父类的方法toString()覆盖父类的方法

13、area()。19Sept.2009ConfidentialJNRPJNRP20/43public class MyPoint protected int x;/protected 保护级别,在子类中可见 protected int y;/protected 保护级别,在子类中可见 MyPoint()(调用MyPoint类的无参数构造方法);MyPoint(int x,int y)this.x=x;this.y=y;public String toString()return(+x+,+y+);20Sept.2009ConfidentialJNRPJNRP21/43public class M

14、ycircle extends MyPoint protected int radius;/圆的半径 public Mycircle()(调用Mycircle类的无参数构造方法);public Mycircle(int x,int y,int radius)/super(x,y);/调用父类有2个参数的构造方法 this.x=x;this.y=y;this.radius=radius;public double area()return Math.PI*radius*radius;public String toString()/覆盖父类的同名方法 /return 圆心+(+x+,+y+)+;

15、半径:+radius;return 圆心+super.toString()+;半径:+radius;21Sept.2009ConfidentialJNRPJNRP22/43public class MySphere extends MyCircle protected int z;public MySphere()(调用MySphere类的无参数构造方法);public MySphere(int x,int y,int z,int radius)/super(x,y,radius);/调用父类有3个整型参数的构造方法*/this.x=x;this.y=y;this.radius=radius;

16、this.z=z;public double area()/覆盖父类的同名方法,求球的表面 return 4*Math.PI*radius*radius;public double volume()/子类添加的求球的体积的方法:return 4*Math.PI*Math.pow(radius,3)/3;public String toString()/覆盖父类的同名方法,满足子类的要求 return 球心:+(+x+,+y+,+z+)+;半径:+radius;22Sept.2009ConfidentialJNRPJNRP23/43思考类的构造方法的调用顺序?查看输出思考类的构造方法的调用顺序?

17、查看输出public class TestMySphere public static void main(String args)MySphere obj=new MySphere();obj.setX(5);obj.setY(15);obj.setZ(25);obj.setRadius(5);System.out.println(obj.toString();(球的面积:+obj.area();(球的体积:+obj.volume();23Sept.2009ConfidentialJNRPJNRP24/43改变实例化方式,查看输出查看输出public class TestMySphere p

18、ublic static void main(String args)MySphere obj=new MySphere(1,2,3,4);System.out.println(obj.toString();(球的面积:+obj.area();(球的体积:+obj.volume();24Sept.2009ConfidentialJNRPJNRP25/43结论结论:实例化过程实例化过程setRadius();getRadius();area();toString();MyPointprotected int xprotected int ysetX();getX();setY();getY();

19、toString()MyCircleprotected int radiusMyCircle()MySphereprotected int zsetZ();getZ();area();volumn();toString()MySphere()MyPoint()TestMySphereNew MySphere()MySphere(x,y,z,radius)MyPoint(x,y)MyCircle(x,y,radius)New MySphere(1,2,3,4)MyPoint()MyCircle()25Sept.2009ConfidentialJNRPJNRP26/43n在Mycircle的构造方

20、法中使用super(x,y);在MySphere的构造方法中使用super(x,y,radius);演示结果。26Sept.2009ConfidentialJNRPJNRP27/43构造方法调用顺序Java 会让子类的构造方法自动地调用基类的构造方法。n子类构造函数:无参数:先调用父类无参数的构造函数;有参数:若无super(参数),先调用父类无参数的构造函数;若有super(参数),不会调用父类无参数的构造函数。27Sept.2009ConfidentialJNRPJNRP28/43n继承情况下的初始化引入继承概念后初始化执行顺序:l父类的static变量;l子类的static变量;l父类的

21、实例变量;l父类的构造方法;l子类的实例变量;l子类的构造方法;28Sept.2009ConfidentialJNRPJNRP30/43多态是面向对象系统中的又一个重要特性。在java语言中,提供了两种多态机制:重载、重写。重载:同一个类中多个方法有相同的名字,不同的参数列表,这种情况称 为方法重载。调用时根据形参的个数和类型来决定调用的是哪个方法。返回类型不同并不足以构成方法重载。重写:子类重写父类的成员方法。子类中重写的方法必须与父类方法有:相同的名字、参数表、返回类型。Java虚拟机会根据调用这个方法的类来确定哪个方法被调用。可通过super关键字调用直属父类中被重写的方法二、二、多态多

22、态多态多态30Sept.2009ConfidentialJNRPJNRP31/43重载 exten_super_in_oneAddOverriddenpublic class AddOverriddenint add(int a,int b)int add(int a,int b,int c)double add(double a,double b)重写 覆盖exten_super_in_oneOverRiddenDemo1.javaclass Avoid display()class B extends Avoid display()二、二、多态多态31判断:判断:println方法的声明方

23、法的声明 是重载还是是重载还是覆盖?public void println()public void println(boolean x)public void println(char x)public void println(int x)public void println(long x)public void println(float x)public void println(double x)public void println(char x)public void println(String x)public void println(Object x)二、二、多态多态重

24、载重载32Sept.2009ConfidentialJNRPJNRP33/43exten_super_in_one 输出结果是?class fathervoid display()System.out.println(“fathers method display()called!);void print()System.out.println(“fathers method print()called!);class son extends father void display()System.out.println(“sons method display()called!);void

25、print_b()System.out.println(“sons method print_b()called!);public class OverRiddenDemo1public static void main(String args)father father=new father();father.display();father.print();father fa=new son();fa.display();/A的引用,的引用,B的方法的方法 fa.print();33Sept.2009ConfidentialJNRPJNRP34/43nJava中允许父类对象和子类对象之间进

26、行类型转换。子类对象可以自动向父类对象进行转换;但父类对象转换成子类对象时,必须要强制类型转换。Father father=new Son();father.display();/A的引用,B的方法 Son son =(Son)father;/强制转换nJava运行时多态:运行时,Java能根据引用的实例动态地选择将要运行的方法的实际版本。这是Java的运行时多态。三三、子类对象和父类对象的转换子类对象和父类对象的转换 子类与父类对象的转换34Sept.2009ConfidentialJNRPJNRP35/43例3.15MyCircle obj2=new MySphere(8,8,8,10);

27、System.out.println(t+obj2.toString();System.out.println(t球的表面积:+obj2.area();/System.out.println(obj2.volume();/出错,obj2是圆类的引用。if(obj2 instanceof MySphere)MySphere obj3=(MySphere)obj2;/强制转换 System.out.println(obj3:球类引用);System.out.println(t球的体积:+obj3.volume();35Sept.2009ConfidentialJNRPJNRP36/43抽象类和抽象

28、方法抽象类和抽象方法1、抽象方法:只有方法头、没有方法体的方法。2、抽象类:包含抽象方法的类。抽象类、抽象方法的特征:n抽象类的属性和方法都是他的子类的公共属性和方法的集合n抽象类不能被实例化。n子类必须实现父类的所有抽象方法,否则必须仍然定义为抽象类n抽象类中也存在一般方法npublic void show()n二、二、抽象类抽象类36Sept.2009ConfidentialJNRPJNRP37/43n声明抽象类的格式:声明抽象类的格式:abstract class 类名类名 .n抽象方法抽象方法 格式如下:格式如下:abstract 数据类型数据类型 方法名方法名(paramlist);

29、注意:声明格式中没有注意:声明格式中没有 ,最后的最后的;不能省略。不能省略。抽象类抽象类的关键的关键字字抽象方法抽象方法的关键字的关键字37Sept.2009ConfidentialJNRPJNRP38/433、抽象类与抽象方法的使用 例:class_extend_exsample abstractExanimaln抽象类只是预先确定了总体结构,缺少实际内容或实现过程n不能被实例化,所以只能被继承n以它为基类,用子类创建对象,同时将抽象方法重写。38Sept.2009ConfidentialJNRPJNRP39/43拓展/抽象类、抽象方法使用import;abstract class Car

30、 /公用数据成员声明 public Color color;/车辆颜色 public int gearNum;/档位数 public String tiretype;/轮胎型号 public float engine;/引擎排气量 /公共抽象方法声明 public abstract void shiftgear();/换档 public abstract void brake();/刹车 public abstract void aircon();/开冷气 public abstract void headlight();/开大灯 39Sept.2009ConfidentialJNRPJNRP

31、40/43 class Audi extends Car static int gearNum=5;/声明gearNum为类栏 public Audi()tiretype=GoodTire2085BT;/轮胎型号 engine=2400.0f;/排气量 public void shiftgear()/换档(轿车换档方式:+gearNum+档);public void(助力刹车系统);/刹车 public void aircon();/开冷气 public void headlight();/开大灯 40Sept.2009ConfidentialJNRPJNRP41/43public class

32、 MyCar extends Audi private Color color;public MyCar()color=Color.blue;/设置车辆颜色 public static void main(String args)MyCar mycar=new MyCar();mycar.equipment();mycar.shiftgear();mycar.brake();public void equipment()(我的车档位数:+this.gearNum);(我的车颜色:+this.color);(我的车轮胎型号:+this.tiretype);(我的车引擎排气量:+this.engi

33、ne);public void shiftgear()/换档-覆盖的新方法 super.shiftgear();(我的车换档方式:+this.gearNum+档);41Sept.2009ConfidentialJNRPJNRP42/43重点:n继承(方法覆盖、变量隐藏),super;n多态:方法重载与方法覆盖。Java运行时多态。n抽象类。了解:n继承中:子类对父类构造函数的调用super();42Sept.2009ConfidentialJNRPJNRP43/43n作业:1、抽象类的特点。2、什么是类的继承、其特点?3、方法重载 与方法覆盖 有什么不同?4、(上机题:继承)定义一个学生类 S

34、tudent,它继承Person类。Student成员:继承来自父类的变量 name(String),性别sex(String),出生年月birthday(类Birthday);新增成员变量:学号 number(int),三门功课的成绩:英语 eng(int),语文 china(int),数学 math(int)方法:覆盖Person的同名方法show(),显示学生所有信息。新增:aver()求三门功课平均分;Person类:见书P9643Sept.2009ConfidentialJNRPJNRP44/435、p145:9(抽象)上机:nP145 :9 (仿照3.10,3.11继承)n例3.16,3.17(抽象类、运行时多态)44

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 大学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁