面向对象特性:继承和多态.ppt

上传人:牧羊曲112 文档编号:6034374 上传时间:2023-09-16 格式:PPT 页数:41 大小:2.11MB
返回 下载 相关 举报
面向对象特性:继承和多态.ppt_第1页
第1页 / 共41页
面向对象特性:继承和多态.ppt_第2页
第2页 / 共41页
面向对象特性:继承和多态.ppt_第3页
第3页 / 共41页
面向对象特性:继承和多态.ppt_第4页
第4页 / 共41页
面向对象特性:继承和多态.ppt_第5页
第5页 / 共41页
点击查看更多>>
资源描述

《面向对象特性:继承和多态.ppt》由会员分享,可在线阅读,更多相关《面向对象特性:继承和多态.ppt(41页珍藏版)》请在三一办公上搜索。

1、1,面向对象特性:继承和多态,2,回顾,在Java程序中,代码封装带给我们的好处是什么?举例说明什么是方法重载?Java中的构造方法与实例方法,有什么区别?,3,本章任务,升级HelloWorld,输出Oracle职员的基本信息:使用继承提高代码的复用性 使用多态提高代码的可扩展性及可维护性,4,掌握继承掌握super关键字掌握多态,本章目标,5,生活中的继承 2-1,生活中,继承的例子随处可见,动物,食草动物,食肉动物,谁是父类?谁是子类?能说出继承的特点吗?,继承需要符合的关系:is-a,父类更通用、子类更具体,6,生活中的继承 2-2,子类具有父类的一般特性(包括属性和行为),以及自身特

2、殊的特性,巴士是汽车吗?卡车是汽车吗?出租车是汽车吗?,汽车,请问:出租车包含哪些属性和行为呢?,7,为什么需要继承 4-1,开发Oracle职员类,其中职员分为Java职员以及.NET职员,各自的要求如下:Java职员属性:姓名、所属中心方法:编写代码(步骤:启动java开发工具、开始编码)、自我介绍.NET职员属性:姓名、所属中心方法:编写代码(步骤:启动.NET开发工具、开始编码)、自我介绍,8,请问:以下这个解决方案中存在着什么问题?,为什么需要继承 4-2,代码存在重复,违背了“write once run anywhere”的原则,9,为什么需要继承 4-3,如何改进?有没有可能建

3、立继承关系,让子类自动继承父类的属性和方法?,Java职员是职员吗?.NET职员是职员吗?,public class OracleStaff private String name;/职员姓名private String school;/所在中心public OracleStaff(String myName,String mySchool)name=myName;school=mySchool;public void giveLesson()(“开始编码);public void introduction()(大家好!我是“+school+的+name+。);,现在,所有子类中相同的代码都抽

4、取到父类中了,10,为什么需要继承 4-4,public class OracleJavaStaff2 extends OracleStaff public OracleJavaStaff2(String myName,String mySchool)super(myName,mySchool);public void giveLesson()System.out.println(“启动 java开发工具);super.giveLesson();,public class OracleDotNetStaff2 extends OracleStaff public OracleDotNetSta

5、ff2(String myName,String mySchool)super(myName,mySchool);public void giveLesson()(启动.NET开发工具);super.giveLesson();,使用继承,可以有效实现代码复用,子类自动继承父类的属性和方法,子类中不再存在重复代码,11,如何实现继承 3-1,在Java语言中,用extends关键字来表示一个类继承了另一个类,例如:,public class OracleJavaStaff2 extends OracleStaff/其余代码省略,在父类中只定义一些通用的属性与方法,例如:,public class

6、 OracleStaff private String name;/职员姓名private String school;/所在中心public OracleStaff(String myName,String mySchool)/初始化属性值public void giveLesson()/编码方法的具体实现 public void introduction()/自我介绍方法的具体实现,12,如何实现继承 3-2,子类自动继承父类的属性和方法,子类中可以定义特定的属性和方法,public class OracleStaff private String name;/职员姓名private St

7、ring school;/所在中心public OracleStaff(String myName,String mySchool)/初始化属性值public void giveLesson()/编码方法的具体实现 public void introduction()/自我介绍方法的具体实现,public class OracleJavaStaff2 extends OracleStaff public OracleJavaStaff2(String myName,String mySchool)super(myName,mySchool);public void giveLesson()Sy

8、stem.out.println(“启动java开发工具);super.giveLesson();,由于giveLesson()方法与父类的实现有所不同,因此重写了该方法,方法重写:子类和父类的方法具有相同的名称、参数列表、返回类型,父类中的属性和方法可以被子类继承,13,public class OracleJavaStaff2 extends OracleStaff public OracleJavaStaff2(String myName,String mySchool)super(myName,mySchool);,如何实现继承 3-3,子类的构造方法中,通过super关键字调用父类的

9、构造方法,方法重写后,通过super关键字调用父类的方法,public class OracleJavaStaff2 extends OracleStaff public void giveLesson()System.out.println(启动 Eclipse);super.giveLesson();,通过调用父类的构造方法,完成对属性值的初始化,14,一切类的“祖先”Object,在Java 中,所有的Java类都直接或间接地继承了类,public class MyObject/,public class MyObect extends Object/,在Eclipse中调用MyObje

10、ct对象的成员,会自动弹出继承自Object的所有方法,15,小结 1,请编码实现动物世界的继承关系:动物(Animal)具有行为:吃(eat)、睡觉(sleep)动物包括:兔子(Rabbit),老虎(Tiger)这些动物吃的行为各不相同(兔子吃草,老虎吃肉);但睡觉的行为是一致的。请通过继承实现以上需求,并编写测试类AnimalTest进行测试。,16,继承,继承与构造创建子类的对象会调用子类和父类的构造方法顺序是先调用父类的构造方法,再调用子类的构造方法关于继承Object类是一切类的父类如果一个类如果继承Object可以省略继承的描述一个父类可以有多个子类一个子类只能有一个父类,17,继

11、承与构造,在继承关系中,因创建子类对象而调用子类的构造方法时。会在执行子类构造方法时最先调用并执行其直接父类的构造方法。Object类的构造器总是最先被执行,构造器的执行顺序1-A类构造方法2-B类构造方法3-C类构造方法,18,引用的指向1,内存示意图:,Student stu=new Student();,实例,stu,19,引用的指向2,父类类型引用指向子类类型实例:小明在喝水,他喝的真的是“水”么?小明在喝:可乐、矿泉水、绿茶,水,20,为什么需要多态 1-1,坐车去世博园,21,为什么需要多态 2-1,搭车去世博园,和邻居搭讪上车 到目的地道谢下车,22,为什么需要多态 2-2,坐火

12、车去世博园,买票检票 上车到目的地下车,23,为什么需要多态 2-3,坐公交车去世博园,等车排队上车 买票到目的地下车,24,为什么需要多态 2-4,打出租车去世博园,拦车上车 到目的地付车钱下车,25,多态的实现1,public class Car public void go(),public class privateCar extends Carpublic void go()System.out.println(和邻居搭讪);System.out.println(上车);System.out.println(到目的地);System.out.println(道谢);System.ou

13、t.println(下车);,public class Train extends Carpublic void go()System.out.println(买票);System.out.println(检票);System.out.println(上车);System.out.println(到目的地);System.out.println(下车);,public class Bus extends Carpublic void go()System.out.println(等车排队);System.out.println(上车);System.out.println(买票);System

14、.out.println(到目的地);System.out.println(下车);,public class Texi extends Car public void go()System.out.println(拦车);System.out.println(上车);System.out.println(到目的地);System.out.println(付车钱);System.out.println(下车);,子类重写父类的方法,26,多态的实现2,如何调用?实现代码,父类类型引用指向子类类型实例,Car car=new Train();car.go();,Car car=new Bus()

15、;car.go();,Car car=new PrivateCar();car.go();,Car car=new Texi();car.go();,和邻居搭讪上车 到目的地道谢下车,等车排队上车 买票到目的地下车,买票检票 上车到目的地下车,拦车上车 到目的地付车钱下车,27,为什么需要多态 5-1,在Oracle职员类的基础上,开发一个类代表总部,负责对各职员进行评估,评估内容包括:1、职员的自我介绍 2、职员的授课,28,为什么需要多态 5-2,public class HQ1 public void judge(OracleJavaStaff2 t)t.introduction();t

16、.giveLesson();public void judge(OracleDotNetStaff2 t)t.introduction();t.giveLesson();public static void main(String args)HQ1 hq=new HQ1();hq.judge(new OracleJavaStaff2(李明,北京中心“);hq.judge(new OracleDotNetStaff2(张明,天津中心“);,第一种解决方案,大家好!我是北京中心的李明.启动 java开发工具开始编码大家好!我是天津中心的张明.启动.Net开发工具开始编码,控制台输出,29,为什么需

17、要多态 5-3,现在,升级Oracle职员类,增加一种新类型:OracleDBStaff,该类型的职员专门负责数据库,要求如下:属性:姓名、所属中心方法:编码(启动Oracle,开始编码)同时,总部也负责对这类职员进行评估,30,为什么需要多态 5-4,如果在第一种解决方案的基础上去解决,我们需要如下两个步骤:建立OracleDBStaff类修改总部类,增加方法:judge(OracleDBStaff t),每增加一种新的职员类型,都要修改总部类,增加相应的judge(评估)方法,代码的可扩展性及可维护性极差,能找到这个解决方案的弊端吗?,31,为什么需要多态 5-5,第二种解决方案使用多态,

18、public class HQ3 public void judge(OracleStaff t)t.introduction();t.giveLesson();public static void main(String args)HQ3 hq=new HQ3();hq.judge(new OracleJavaStaff2(李明,北京中心“);hq.judge(new OracleDotNetStaff2(张明,天津中心);hq.judge(new OracleDBStaff(“李岚,北京中心“);,可以接收子类类型,根据实际创建的对象类型调用相应方法,大家好!我是北京中心的李明.启动 ja

19、va开发工具开始编码大家好!我是天津中心的张明.启动.Net开发工具开始编码大家好!我是北京中心的李岚.启动 Oracle开始编码,控制台输出,使用多态之后,当需要增加新的子类类型时,无需更改总部类,程序的可扩展性及可维护性增强,32,什么是多态,简单来说,多态是具有表现多种形态的能力的特征 同一个实现接口,使用不同的实例而执行不同操作,彩色打印机,打印机,黑白打印机,打印效果:彩色,打印效果:黑白,打印,打印,33,public class OracleStaff public void giveLesson()(“开始编码);,如何实现多态,1、子类重写父类的方法2、编写方法时,使用父类定

20、义的方法3、运行时,根据实际创建的对象类型动态决定使用哪个方法,34,小结 2,请编码实现如下需求:乐器(Instrument)分为:钢琴(Piano)、小提琴(Violin)各种乐器的弹奏(play)方法各不相同。编写一个测试类InstrumentTest,要求:编写方法testPlay,对各种乐器进行弹奏测试。要依据乐器的不同,进行相应的弹奏。在main方法中进行测试,35,总结 2-1,class Base public String name;public Base()name=Base;public Base(String pName)name=pName;public void m

21、ethod()System.out.println(name);,class Child extends Basepublic Child()super(Child1);name=Child2;,给定如下Java代码,编译运行后,输出结果是什么?,public class Sample public static void main(String args)Child c=new Child();c.method();,Child2,控制台输出,1,2,3,36,总结 2-2,给定如下Java代码,编译运行后,输出结果是什么?,public class OracleStaff public v

22、oid giveLesson()(“开始编码);,public class OracleDBStaff extends OracleStaff public void giveLesson()System.out.println(启动 SqlServer);,1,2,public class Test public static void main(String args)OracleStaff t=new OracleDBStaff();t.giveLesson();,控制台输出,启动 SqlServer,37,使用多态注意什么,使用多态应注意:由于采用了“父类类型的引用指向子类类型的实例”

23、的方式,使得在编译时这个引用只能“.”父类的方法(也可以是属性,但因面向对象的封装性属性应为私有,通常不可访问)。如想让父类类型引用能“.”子类的所有方法,就要让父类也拥有和子类相同的方法,并空实现。子类继承父类时重写父类的方法。,38,为什么需要抽象类,从多态的角度来思考刚才的问题虽然Bus类、Train类、Texi类、PrivateCar类都继承自Car类,但不难发现Car类在程序中即没有被实例化过,也没有实例化的需求。实际生活中也有类似的事例这种不需要实例化的类可以定义成抽象类,39,抽象类与抽象方法,如何定义抽象类:public abstract class 类名什么是抽象方法没有方法体的方法 public abstract void eat();两者间的关系含有抽象方法的类必须是抽象类抽象类不一定含有抽象方法,40,抽象类的特点,抽象类与继承如一个类去继承抽象类,则需要重写抽象类中所有的抽象方法,否则这个类也必须声明成抽象类抽象类与构造抽象类不可以被实例化,但是可以有构造器抽象类的构造方法只能用于辅助其子类的构造过程,41,41,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号