《面向对象特性继承和多态.ppt》由会员分享,可在线阅读,更多相关《面向对象特性继承和多态.ppt(41页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、面向对象特性:面向对象特性:面向对象特性:面向对象特性:继承和多态继承和多态继承和多态继承和多态1回回顾在在Java程序中,代程序中,代码封装封装带给我我们的好的好处是什是什么么?举例例说明什明什么么是方法重是方法重载?Java中的中的构构造方法造方法与与实例方法,有什例方法,有什么区么区别?2本章任本章任务升升级HelloWorld,输出出Oracle职员的基本信息:的基本信息:使用使用继承提高代承提高代码的的复复用性用性 使用多使用多态提高代提高代码的可的可扩展性及可展性及可维护性性3掌握掌握继承承掌握掌握super关关键字字掌握多掌握多态本章目本章目标4生活中的生活中的继承承 2-1生活
2、中,生活中,继承的例子承的例子随随处可可见动物动物食草动物食草动物食肉动物食肉动物谁是父类?谁是父类?谁是子类?谁是子类?能说出继承的特点吗?能说出继承的特点吗?继承需要符合的关系:继承需要符合的关系:is-a,父类更通用、子类更具体,父类更通用、子类更具体5生活中的生活中的继承承 2-2子子类具有父具有父类的一般特性(包括的一般特性(包括属属性和行性和行为),以及自身),以及自身特殊的特性特殊的特性巴士是汽车吗?巴士是汽车吗?卡车是汽车吗?卡车是汽车吗?出租车是汽车吗?出租车是汽车吗?最大载客数量最大载客数量报站报站引擎数量引擎数量外观颜色外观颜色刹车刹车加速加速汽车汽车最大载重量最大载重量
3、卸货卸货所属公司所属公司最大载客数量最大载客数量打发票打发票属性属性行为行为请问:出租车请问:出租车包含哪些属性包含哪些属性和行为呢?和行为呢?6为什什么么需要需要继承承 4-1开开发Oracle职员类,其中,其中职员分分为Java职员以及以及.NET职员,各自的要求如下:,各自的要求如下:Java职员属性:姓名、所属中心属性:姓名、所属中心方法:编写代码(步骤:启动方法:编写代码(步骤:启动java开发工具、开始编码)、自我开发工具、开始编码)、自我介绍介绍.NET职员属性:姓名、所属中心属性:姓名、所属中心方法:编写代码(步骤:启动方法:编写代码(步骤:启动.NET开发工具、开始编码)、自
4、开发工具、开始编码)、自我介绍我介绍7请问:以下:以下这个个解解决决方案中存在着什方案中存在着什么么问题?为什什么么需要需要继承承 4-2public class OracleDotNetStaff private String name;/职员姓名职员姓名private String school;/所在中心所在中心public OracleDotNetStaff(String myName,String mySchool)name=myName;school=mySchool;public void giveLession()System.out.println(“启动启动开发开发工具工具
5、);System.out.println(“开始编码开始编码);public void introduction()System.out.println(大家好!我是大家好!我是 +school+的的+name+.);public class OracleJavaStaff private String name;/职员姓名职员姓名private String school;/所在中心所在中心public OracleJavaStaff(String myName,String mySchool)name=myName;school=mySchool;public void giveLessi
6、on()System.out.println(启动启动javajava开发工具开发工具););System.out.println(开始编码开始编码);public void introduction()System.out.println(大家好!我是大家好!我是 +school+的的+name+.);代码存在重复,违背了代码存在重复,违背了“write once run anywhere”的原则的原则 8为什什么么需要需要继承承 4-3如何改如何改进?有?有没没有可能建立有可能建立继承承关关系,系,让子子类自自动继承父承父类的的属属性和方法?性和方法?Java职员是职员吗?职员是职员吗?.
7、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 introduction()System.out.println(大家好!我是大家好!我是“+school+的
8、的+name+。);现在,所有子类中相同的代码现在,所有子类中相同的代码都抽取到父类中了都抽取到父类中了 属属性性行行为为姓名姓名所在中心所在中心编码编码自我介绍自我介绍职员职员Java职员职员.NET职员职员9为什什么么需要需要继承承 4-4public class OracleJavaStaff2 extends OracleStaff public OracleJavaStaff2(String myName,String mySchool)super(myName,mySchool);public void giveLesson()System.out.println(“启动启动 ja
9、va java开发工具开发工具);super.giveLesson();public class OracleDotNetStaff2 extends OracleStaff public OracleDotNetStaff2(String myName,String mySchool)super(myName,mySchool);public void giveLesson()System.out.println(启动启动.NET.NET开发工具开发工具);super.giveLesson();使用继承,可以有效实现代码复用使用继承,可以有效实现代码复用子类自动继承父类的属性子类自动继承父类
10、的属性和方法,子类中不再存在和方法,子类中不再存在重复代码重复代码10如何如何实现继承承 3-1在在Java语言中,用言中,用extends关关键字字来来表示一表示一个个类继承了另一承了另一个个类,例如:,例如:public class OracleJavaStaff2 extends OracleStaff/其余代码省略其余代码省略在父类中只定义一些通用的属性与方法,例如:public class OracleStaff private String name;/职员姓名职员姓名private String school;/所在中心所在中心public OracleStaff(String
11、myName,String mySchool)/初始化属性值初始化属性值public void giveLesson()/编码方法的具体实现编码方法的具体实现 public void introduction()/自我介绍方法的具体实现自我介绍方法的具体实现 11如何如何实现继承承 3-2子子类自自动继承父承父类的的属属性和方法,子性和方法,子类中可以定中可以定义特定特定的的属属性和方法性和方法public class OracleStaff private String name;/职员姓名职员姓名private String school;/所在中心所在中心public OracleSta
12、ff(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()System.ou
13、t.println(“启动启动java开发工开发工具具);super.giveLesson();由于由于giveLesson()方法与方法与父类的实现有所不同,因此父类的实现有所不同,因此重写了该方法重写了该方法 方法重写:子类和父类的方法具有相同的名称、参数列表、返回类型方法重写:子类和父类的方法具有相同的名称、参数列表、返回类型 父类中的属性和方法可父类中的属性和方法可以被子类继承以被子类继承12public class OracleJavaStaff2 extends OracleStaff public OracleJavaStaff2(String myName,String myS
14、chool)super(myName,mySchool);如何如何实现继承承 3-3子子类的的构构造方法中,通造方法中,通过super关关键字字调用父用父类的的构构造方法造方法方法重方法重写写后,通后,通过super关关键字字调用父用父类的方法的方法public class OracleJavaStaff2 extends OracleStaff public void giveLesson()System.out.println(启动启动 Eclipse);super.giveLesson();通过调用父类的构造方法,通过调用父类的构造方法,完成对属性值的初始化完成对属性值的初始化13一切一
15、切类的的“祖先祖先”Object在在Java 中,所有的中,所有的Java类都直接或都直接或间接地接地继承了承了java.lang.Object类public class MyObject /public class MyObect extends Object /在在Eclipse中调用中调用MyObject对象的成员,会自动弹出继对象的成员,会自动弹出继承自承自Object的所有方法的所有方法14小小结 1请编码实现动物世界的物世界的继承承关关系:系:动物(物(Animal)具有行)具有行为:吃(:吃(eat)、睡)、睡觉(sleep)动物包括:物包括:兔兔子(子(Rabbit),老虎()
16、,老虎(Tiger)这些些动物吃的行物吃的行为各不相同(各不相同(兔兔子吃草,老虎吃肉);但子吃草,老虎吃肉);但睡睡觉的行的行为是一致的。是一致的。请通通过继承承实现以上需求,以上需求,并并编写写测试类AnimalTest进行行测试。15继承承继承与构造创建子类的对象会调用子类和父类的构造方法顺序是先调用父类的构造方法,再调用子类的构造方法关于继承Object类是一切类的父类如果一个类如果继承Object可以省略继承的描述一个父类可以有多个子类一个子类只能有一个父类16继承承与构与构造造在继承关系中,因创建子类对象而调用子类的构造方法时。会在执行子类构造方法时最先调用并执行其直接父类的构造方
17、法。Object类的构造器总是最先被执行A类类B类类C类类继承继承继承继承构造器的执行顺序构造器的执行顺序1-A类构造方法类构造方法2-B类构造方法类构造方法3-C类构造方法类构造方法17引用的指向引用的指向1内存示意图:Student stu=new Student();引用引用实例实例实例地址实例的属性实例实例stu18引用的指向引用的指向2父类类型引用指向子类类型实例:小明在喝水,他喝的真的是“水”么?小明在喝:可乐、矿泉水、绿茶水水茶饮料茶饮料矿泉水矿泉水碳酸饮料碳酸饮料冰露冰露康师傅康师傅绿茶绿茶冰红茶冰红茶可乐可乐雪碧雪碧19为什什么么需要多需要多态 1-1坐车去世博园20为什什么
18、么需要多需要多态 2-1搭车去世博园和和 邻邻 居居 搭搭 讪讪上上车车 到到 目目 的的 地地道道谢谢下下车车21为什什么么需要多需要多态 2-2坐火车去世博园买买票票检检票票 上上车车到到目目的的地地下下车车22为什什么么需要多需要多态 2-3坐公交车去世博园等等 车车 排排 队队上上车车 买买票票到到 目目 的的 地地下下车车23为什什么么需要多需要多态 2-4打出租车去世博园拦拦车车上上车车 到到目目的的地地付付 车车 钱钱下下车车24多多态的的实现1public class Car public void go()public class privateCar extends Car
19、public void go()System.out.println(和邻居搭讪和邻居搭讪);System.out.println(上车上车);System.out.println(到目的地到目的地);System.out.println(道谢道谢);System.out.println(下车下车);public class Train extends Carpublic void go()System.out.println(买票买票);System.out.println(检票检票);System.out.println(上车上车);System.out.println(到目的地到目的地)
20、;System.out.println(下车下车);public class Bus extends Carpublic void go()System.out.println(等车排队等车排队);System.out.println(上车上车);System.out.println(买票买票);System.out.println(到目的地到目的地);System.out.println(下车下车);public class Texi extends Car public void go()System.out.println(拦车拦车);System.out.println(上车上车);S
21、ystem.out.println(到目的地到目的地);System.out.println(付车钱付车钱);System.out.println(下车下车);子类重写父类的方法子类重写父类的方法25多多态的的实现2如何调用?实现代码父类类型引用指向子类类型实例父类类型引用指向子类类型实例Car car=new Train();car.go();Car car=new Bus();car.go();Car car=new PrivateCar();car.go();Car car=new Texi();car.go();和邻居搭讪和邻居搭讪上车上车 到目的地到目的地道谢道谢下车下车等车排队等车
22、排队上车上车 买票买票到目的地到目的地下车下车买票买票检票检票 上车上车到目的地到目的地下车下车拦车拦车上车上车 到目的地到目的地付车钱付车钱下车下车26为什什么么需要多需要多态 5-1在在Oracle职员类的基的基础上,上,开开发一一个个类代表代表总部,部,负责对各各职员进行行评估,估,评估估内内容包括:容包括:1、职员的自我介的自我介绍 2、职员的授的授课27为什什么么需要多需要多态 5-2public class HQ1 public void judge(OracleJavaStaff2 t)t.introduction();t.giveLesson();public void jud
23、ge(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开发工具开发工具开始编码开始编码大家好!我是天津中心的张明大家好!我是天津中心的张明.启动启动
24、.Net开发工具开发工具开始编码开始编码控制台输出控制台输出28为什什么么需要多需要多态 5-3现在,升在,升级Oracle职员类,增加一,增加一种种新新类型:型:OracleDBStaff,该类型的型的职员专门负责数数据据库,要求如下:,要求如下:属属性:姓名、所性:姓名、所属属中心中心方法:方法:编码(启启动Oracle,开开始始编码)同同时,总部也部也负责对这类职员进行行评估估29为什什么么需要多需要多态 5-4如果在第一如果在第一种种解解决决方案的基方案的基础上去解上去解决决,我,我们需要如下需要如下两个两个步步骤:建立建立OracleDBStaff类修改修改总部部类,增加方法:,增加
25、方法:judge(OracleDBStaff t)每增加一种新的职员类型,都要修改总部类,增加相应的每增加一种新的职员类型,都要修改总部类,增加相应的judge(评估评估)方法,代码的可扩展性及可维护性极差方法,代码的可扩展性及可维护性极差 能找到这个解决方案的弊端吗?能找到这个解决方案的弊端吗?30为什什么么需要多需要多态 5-5第二第二种种解解决决方案方案使用多使用多态public class HQ3 public void judge(OracleStaff t)t.introduction();t.giveLesson();public static void main(String
26、args)HQ3 hq=new HQ3();hq.judge(new OracleJavaStaff2(李明李明,北京中心北京中心“);hq.judge(new OracleDotNetStaff2(张明张明,天津中心天津中心);hq.judge(new OracleDBStaff(“李岚李岚,北京中心北京中心“);可以接收子类类型可以接收子类类型根据实际创建的对象根据实际创建的对象类型调用相应方法类型调用相应方法大家好!我是北京中心的李明大家好!我是北京中心的李明.启动启动 java开发工具开发工具开始编码开始编码大家好!我是天津中心的张明大家好!我是天津中心的张明.启动启动.Net开发工具
27、开发工具开始编码开始编码大家好!我是北京中心的李岚大家好!我是北京中心的李岚.启动启动 Oracle开始编码开始编码控制台输出控制台输出使用多使用多态之后,之后,当当需要增加新的子需要增加新的子类类型型时,无需更改,无需更改总部部类,程序的可,程序的可扩展性及可展性及可维护性增强性增强 31什什么么是多是多态简单来来说,多,多态是具有表是具有表现多多种种形形态的能力的特征的能力的特征 同一同一个个实现接口,使用不同的接口,使用不同的实例而例而执行不同操作行不同操作彩色打印机彩色打印机 打印机打印机 黑白打印机黑白打印机打印效果:彩色打印效果:彩色打印效果:黑白打印效果:黑白打印打印 打印打印
28、32public class OracleStaff public void giveLesson()System.out.println(“开始编码开始编码);public class Test public static void main(String args)HQ3 hq=new HQ3();hq.judge(new OracleDBStaff();3如何如何实现多多态1、子、子类重重写写父父类的方法的方法2、编写写方法方法时,使用父,使用父类定定义的方法的方法3、运运行行时,根据,根据实际创建的建的对象象类型型动态决决定使用定使用哪个哪个方法方法public class Oracl
29、eDBStaff extends OracleStaff public void giveLesson()System.out.println(启动启动 Oracle);super.giveLesson();1public class HQ3 public void judge(OracleStaff t)t.giveLesson();233小小结 2请编码实现如下需求:如下需求:乐器(器(Instrument)分)分为:钢琴琴(Piano)、小提琴、小提琴(Violin)各各种种乐器的器的弹奏(奏(play)方法各不相同。)方法各不相同。编写写一一个个测试类InstrumentTest,要求
30、:,要求:编写写方法方法testPlay,对各各种种乐器器进行行弹奏奏测试。要依据。要依据乐器的不器的不同,同,进行相行相应的的弹奏。奏。在在main方法中方法中进行行测试34总结 2-1class Base public String name;public Base()name=Base;public Base(String pName)name=pName;public void method()System.out.println(name);class Child extends Basepublic Child()super(Child1);name=Child2;给定如下定如下J
31、ava代代码,编译运运行后,行后,输出出结果是什果是什么么?public class Sample public static void main(String args)Child c=new Child();c.method();Child2 控制台输出控制台输出12335总结 2-2给定如下定如下Java代代码,编译运运行后,行后,输出出结果是什果是什么么?public class OracleStaff public void giveLesson()System.out.println(“开始编码开始编码);public class OracleDBStaff extends Ora
32、cleStaff public void giveLesson()System.out.println(启动启动 SqlServer);12public class Test public static void main(String args)OracleStaff t =new OracleDBStaff();t.giveLesson();控制台输出控制台输出 启动启动 SqlServer 36使用多使用多态注意什注意什么么使用多态应注意:由于采用了“父类类型的引用指向子类类型的实例”的方式,使得在编译时这个引用只能“.”父类的方法(也可以是属性,但因面向对象的封装性属性应为私有,通常不
33、可访问)。如想让父类类型引用能“.”子类的所有方法,就要让父类也拥有和子类相同的方法,并空实现。子类继承父类时重写父类的方法。37为什什么么需要抽象需要抽象类从多态的角度来思考刚才的问题虽然Bus类、Train类、Texi类、PrivateCar类都继承自Car类,但不难发现Car类在程序中即没有被实例化过,也没有实例化的需求。实际生活中也有类似的事例这种不需要实例化的类可以定义成抽象类38抽象抽象类与与抽象方法抽象方法如何定义抽象类:public abstract class 类名什么是抽象方法没有方法体的方法 public abstract void eat();两者间的关系含有抽象方法的类必须是抽象类抽象类不一定含有抽象方法39抽象抽象类的特点的特点抽象类与继承如一个类去继承抽象类,则需要重写抽象类中所有的抽象方法,否则这个类也必须声明成抽象类抽象类与构造抽象类不可以被实例化,但是可以有构造器抽象类的构造方法只能用于辅助其子类的构造过程404141
限制150内