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

上传人:本田雅阁 文档编号:2264885 上传时间:2019-03-13 格式:PPT 页数:41 大小:2.56MB
返回 下载 相关 举报
面向对象特性继承和多态.ppt_第1页
第1页 / 共41页
面向对象特性继承和多态.ppt_第2页
第2页 / 共41页
面向对象特性继承和多态.ppt_第3页
第3页 / 共41页
亲,该文档总共41页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

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

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() System.out.println(“开始编码“); public void introd

4、uction() System.out.println(“大家好!我是“ + school + “的“ + name + “。“); ,现在,所有子类中相同的代码都抽取到父类中了,10,为什么需要继承 4-4,public class OracleJavaStaff2 extends OracleStaff public OracleJavaStaff2(String myName, String mySchool) super(myName, mySchool); public void giveLesson() System.out.println(“启动 java开发工具“); supe

5、r.giveLesson(); ,public class OracleDotNetStaff2 extends OracleStaff public OracleDotNetStaff2(String myName, String mySchool) super(myName, mySchool); public void giveLesson() System.out.println(“ 启动.NET开发工具“); super.giveLesson(); ,使用继承,可以有效实现代码复用,子类自动继承父类的属性和方法,子类中不再存在重复代码,11,如何实现继承 3-1,在Java语言中,用

6、extends关键字来表示一个类继承了另一个类,例如:,public class OracleJavaStaff2 extends OracleStaff /其余代码省略 ,在父类中只定义一些通用的属性与方法,例如:,public class OracleStaff private String name; / 职员姓名 private String school; / 所在中心 public OracleStaff(String myName, String mySchool) /初始化属性值 public void giveLesson() /编码方法的具体实现 public void i

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

8、lass OracleJavaStaff2 extends OracleStaff public OracleJavaStaff2(String myName, String mySchool) super(myName, mySchool); public void giveLesson() System.out.println(“启动java开发工具“); super.giveLesson(); ,由于giveLesson()方法与父类的实现有所不同,因此重写了该方法,方法重写:子类和父类的方法具有相同的名称、参数列表、返回类型,父类中的属性和方法可以被子类继承,13,public cla

9、ss OracleJavaStaff2 extends OracleStaff public OracleJavaStaff2(String myName, String mySchool) super(myName, mySchool); ,如何实现继承 3-3,子类的构造方法中,通过super关键字调用父类的构造方法,方法重写后,通过super关键字调用父类的方法,public class OracleJavaStaff2 extends OracleStaff public void giveLesson() System.out.println(“启动 Eclipse“); super

10、.giveLesson(); ,通过调用父类的构造方法,完成对属性值的初始化,14,一切类的“祖先”Object,在Java 中,所有的Java类都直接或间接地继承了java.lang.Object类,public class MyObject / ,public class MyObect extends Object / ,在Eclipse中调用MyObject对象的成员,会自动弹出继承自Object的所有方法,15,小结 1,请编码实现动物世界的继承关系: 动物(Animal)具有行为:吃(eat)、睡觉(sleep) 动物包括:兔子(Rabbit),老虎(Tiger) 这些动物吃的行为

11、各不相同(兔子吃草,老虎吃肉);但睡觉的行为是一致的。 请通过继承实现以上需求,并编写测试类AnimalTest进行测试。,16,继承,继承与构造 创建子类的对象会调用子类和父类的构造方法 顺序是先调用父类的构造方法,再调用子类的构造方法 关于继承 Object类是一切类的父类 如果一个类如果继承Object可以省略继承的描述 一个父类可以有多个子类 一个子类只能有一个父类,17,继承与构造,在继承关系中,因创建子类对象而调用子类的构造方法时 。会在执行子类构造方法时最先调用并执行其直接父类的构造方法。 Object类的构造器总是最先被执行,构造器的执行顺序 1 - A类构造方法 2 - B类

12、构造方法 3 - C类构造方法,18,引用的指向1,内存示意图:,Student stu = new Student();,实例,stu,19,引用的指向2,父类类型引用指向子类类型实例: 小明在喝水,他喝的真的是“水”么? 小明在喝:可乐、矿泉水、绿茶,水,20,为什么需要多态 1-1,坐车去世博园,21,为什么需要多态 2-1,搭车去世博园,和邻居搭讪 上车 到目的地 道谢 下车,22,为什么需要多态 2-2,坐火车去世博园,买票 检票 上车 到目的地 下车,23,为什么需要多态 2-3,坐公交车去世博园,等车排队 上车 买票 到目的地 下车,24,为什么需要多态 2-4,打出租车去世博园

13、,拦车 上车 到目的地 付车钱 下车,25,多态的实现1,public class Car public void go() ,public class privateCar extends Car public void go() System.out.println(“和邻居搭讪“); System.out.println(“上车“); System.out.println(“到目的地“); System.out.println(“道谢“); System.out.println(“下车“); ,public class Train extends Car public void go()

14、 System.out.println(“买票“); System.out.println(“检票“); System.out.println(“上车“); System.out.println(“到目的地“); System.out.println(“下车“); ,public class Bus extends Car public void go() System.out.println(“等车排队“); System.out.println(“上车“); System.out.println(“买票“); System.out.println(“到目的地“); System.out.p

15、rintln(“下车“); ,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(); car.go()

16、;,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.introduct

17、ion(); t.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开发工具 开始编码 大家好!我是天津中心的张明.

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

19、方案的弊端吗?,31,为什么需要多态 5-5,第二种解决方案使用多态,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(“李岚“,“北

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

21、ublic void giveLesson() System.out.println(“开始编码“); ,如何实现多态,1、子类重写父类的方法 2、编写方法时,使用父类定义的方法 3、运行时,根据实际创建的对象类型动态决定使用哪个方法,34,小结 2,请编码实现如下需求: 乐器(Instrument)分为:钢琴(Piano)、小提琴(Violin) 各种乐器的弹奏( play )方法各不相同。 编写一个测试类InstrumentTest,要求: 编写方法testPlay,对各种乐器进行弹奏测试。要依据乐器的不同,进行相应的弹奏。 在main方法中进行测试,35,总结 2-1,class Bas

22、e public String name; public Base() name = “Base“; public Base(String pName) name = pName; public void method() System.out.println(name); ,class Child extends Base public Child() super(“Child1“); name=“Child2“; ,给定如下Java代码,编译运行后,输出结果是什么?,public class Sample public static void main(String args) Child

23、 c = new Child(); c.method(); ,Child2,控制台输出,1,2,3,36,总结 2-2,给定如下Java代码,编译运行后,输出结果是什么?,public class OracleStaff public void giveLesson() System.out.println(“开始编码“); ,public class OracleDBStaff extends OracleStaff public void giveLesson() System.out.println(“启动 SqlServer“); ,1,2,public class Test publ

24、ic static void main(String args) OracleStaff t = new OracleDBStaff (); t.giveLesson(); ,控制台输出,启动 SqlServer,37,使用多态注意什么,使用多态应注意: 由于采用了“父类类型的引用指向子类类型的实例”的方式,使得在编译时这个引用只能“.”父类的方法(也可以是属性,但因面向对象的封装性属性应为私有,通常不可访问)。 如想让父类类型引用能“.”子类的所有方法,就要让父类也拥有和子类相同的方法,并空实现。子类继承父类时重写父类的方法。,38,为什么需要抽象类,从多态的角度来思考刚才的问题 虽然Bus

25、类、Train类、Texi类、PrivateCar类都继承自Car类,但不难发现Car类在程序中即没有被实例化过,也没有实例化的需求。 实际生活中也有类似的事例 这种不需要实例化的类可以定义成抽象类,39,抽象类与抽象方法,如何定义抽象类: public abstract class 类名 什么是抽象方法 没有方法体的方法 public abstract void eat(); 两者间的关系 含有抽象方法的类必须是抽象类 抽象类不一定含有抽象方法,40,抽象类的特点,抽象类与继承 如一个类去继承抽象类,则需要重写抽象类中所有的抽象方法,否则这个类也必须声明成抽象类 抽象类与构造 抽象类不可以被实例化,但是可以有构造器 抽象类的构造方法只能用于辅助其子类的构造过程,41,41,

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

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1