面向对象的Java实现-继承和多态(第十一讲)2•掌握继承•掌握super关键字•掌握多态本章目标3生活中的继承2-1•生活中,继承的例子随处可见动物食草动物食肉动物谁是父类?谁是子类?能说出继承的特点吗?继承需要符合的关系:is-a,父类更通用、子类更具体4生活中的继承2-2•子类具有父类的一般特性(包括属性和行为),以及自身特殊的特性巴士是汽车吗?卡车是汽车吗?出租车是汽车吗?最大载客数量报站引擎数量外观颜色刹车加速汽车最大载重量卸货所属公司最大载客数量打发票属性行为请问:出租车包含哪些属性和行为呢?5为什么需要继承4-1•开发教员类,其中教员分为Java教员以及.NET教员,各自的要求如下:–Java教员属性:姓名、所属中心方法:授课(步骤:打开Eclipse、实施理论课授课)、自我介绍–.NET教员属性:姓名、所属中心方法:授课(步骤:打开Visualstudio2005、实施理论课授课)、自我介绍6•请问:以下这个解决方案中存在着什么问题?为什么需要继承4-2publicclassDotNetTeacher{privateStringname;//教员姓名privateStringschool;//所在中心publicDotNetTeacher(StringmyName,StringmySchool){name=myName;school=mySchool;}publicvoidgiveLession(){System.out.println(启动VisualStudio2005);System.out.println(知识点讲解);System.out.println(总结提问);}publicvoidintroduction(){System.out.println(大家好!我是+school+的+name+.);}}publicclassJavaTeacher{privateStringname;//教员姓名privateStringschool;//所在中心publicJavaTeacher(StringmyName,StringmySchool){name=myName;school=mySchool;}publicvoidgiveLession(){System.out.println(启动Eclipse);System.out.println(知识点讲解);System.out.println(总结提问);}publicvoidintroduction(){System.out.println(大家好!我是+school+的+name+.);}}代码存在重复,违背了“writeonce,onlyonce”的原则7为什么需要继承4-3•如何改进?有没有可能建立继承关系,让子类自动继承父类的属性和方法?Java教员是教员吗?.NET教员是教员吗?publicclassTeacher{privateStringname;//教员姓名privateStringschool;//所在中心publicTeacher(StringmyName,StringmySchool){name=myName;school=mySchool;}publicvoidgiveLesson(){System.out.println(知识点讲解);System.out.println(总结提问);}publicvoidintroduction(){System.out.println(大家好!我是“+school+的+name+。);}}现在,所有子类中相同的代码都抽取到父类中了属性行为姓名所在中心授课自我介绍教员Java教员.NET教员8为什么需要继承4-4publicclassJavaTeacher2extendsTeacher{publicJavaTeacher2(StringmyName,StringmySchool){super(myName,mySchool);}publicvoidgiveLesson(){System.out.println(启动Eclipse);super.giveLesson();}}publicclassDotNetTeacher2extendsTeacher{publicDotNetTeacher2(StringmyName,StringmySchool){super(myName,mySchool);}publicvoidgiveLesson(){System.out.println(启动VisualStudio.NET);super.giveLesson();}}使用继承,可以有效实现代码复用子类自动继承父类的属性和方法,子类中不再存在重复代码9如何实现继承3-1•在Java语言中,用extends关键字来表示一个类继承了另一个类,例如:publicclassJavaTeacher2extendsTeacher{//其余代码省略}在父类中只定义一些通用的属性与方法,例如:publicclassTeacher{privateStringname;//教员姓名privateStringschool;//所在中心publicTeacher(StringmyName,StringmySchool){//初始化属性值}publicvoidgiveLesson(){//授课方法的具体实现}publicvoidintroduction(){//自我介绍方法的具体实现}}10如何实现继承3-2•子类自动继承父类的属性和方法,子类中可以定义特定的属性和方法publicclassTeacher{privateStringname;//教员姓名privateStringschool;//所在中心publicTeacher(StringmyName,StringmySchool){//初始化属性值}publicvoidgiveLesson(){//授课方法的具体实现}publicvoidintroduction(){//自我介绍方法的具体实现}}publicclassJavaTeacher2extendsTeacher{publicJavaTeacher2(StringmyName,StringmySchool){super(myName,mySchool);}publicvoidgiveLesson(){System.out.println(启动Eclipse);super.giveLesson();}}由于giveLesson()方法与父类的实现有所不同,因此重写了该方法方法重写:子类和父类的方法具有相同的名称、参数列表、返回类型父类中的属性和方法可以被子类继承11publicclassJavaTeacher2extendsTeacher{publicJavaTeacher2(StringmyName,StringmySchool){super(myName,mySchool);}}如何实现继承3-3•子类的构造方法中,通过super关键字调用父类的构造方法方法重写后,通过super关键字调用父类的方法publicclassJavaTeacher2extendsTeacher{publicvoidgiveLesson(){System.out.println(启动Eclipse);super.giveLesson();}}通过调用父类的构造方法,完成对属性值的初始化12一切类的“祖先”——Object•在Java中,所有的Java类都直接或间接地继承了java.lang.Object类publicclassMyObject{//…}publicclassMyObectextendsObject{//…}在Eclipse中调用MyObject对象的成员,会自动弹出继承自Object的所有方法注意•父类的私有数据域在子类中是不可以直接访问的。13小知识点•子类调用父类的方法•super.方法名(实参);•覆盖方法•子类从父类中继承方法,但修改了方法实现。1415小结1•请编码实现动物世界的继承关系:–动物(Animal)具有行为:吃(eat)、睡觉(sleep)–动物包括:兔子(Rabbit),老虎(Tiger)–这些动物吃的行为各不相同(兔子吃草,老虎吃肉);但睡觉的行为是一致的。•请通过继承实现以上需求,并编写测试类AnimalTest进行测试。16为什么需要多态5-1•在教员类的基础上,开发一个类代表总部,负责对各教员进行评估,评估内容包括:1、教员的自我介绍2、教员的授课17为什么需要多态5-2publicclassHQ1{publicvoidjudge(JavaTeacher2t){t.introduction();t.giveLesson();}publicvoidjudge(DotNetTeacher2t){t.introduction();t.giveLesson();}publicstaticvoidmain(String[]args){HQ1hq=newHQ1();hq.judge(newJavaTeacher2(李明,北京中心“));hq.judge(newDotNetTeacher2(张明,天津中心“));}}•第一种解决方案大家好!我是北京中心的李明.启动Eclipse知识点讲解总结提问大家好!我是天津中心的张明.启动VisualStudio2005知识点讲解总结提问控制台输出18为什么需要多态5-3•现在,升级教员类,增加一种新类型:DBTeacher,该类型的教员专门负责教授数据库,要求如下:–属性:姓名、所属中心–方法:授课(启动SqlServer、实施理论课授课)、自我介绍•同时,总部也负责对这类教员进行评估19为什么需要多态5-4•如果在第一种解决方案的基础上去解决,我们需要如下两个步骤:–建立DBTeacher类–修改总部类,增加方法:judge(DBTeachert)每增加一种新的教员类型,都要修改总部类,增加相应的judge(评估)方法,代码的可扩展性及可维护性极差能找到这个解决方案的弊端吗?20为什么需要多态5-5•第二种解决方案——使用多态publicclassHQ3{publicvoidjudge(Teachert){t.introduction();t.giveLesson();}publicstaticvoidmain(String[]args){HQ3hq=newHQ3();hq.judge(newJavaTeacher2(李明,北京中心“));hq.judge(newADotNetTeacher2(张明,天津中心));hq.judge(newDBTeacher(“李岚,北京中心“));}}可以接收子类类型根据实际创建的对象类型调用相应方法大家好!我是北京中心的李明.启动Eclipse知识点讲解总结提问大家好!我是天津中心的张明.启动VisualStudio2005知识点讲解总结提问大家好!我是北京中心的李岚.启动SqlServer知识点讲解总结提问控制台输出使用多态之后,当需要增加新的子类类型时,无需更改总部类,程序的可扩展性及可维护性增强•上面这种方案也叫动态绑定2122什么是多态简单来说,多态是具有表现多种形态的能力的特征同一个实现接口,使用不同的实例而执行不同操作彩色打印机打印机黑白打印机打印效果:彩色打印效果:黑白打印打印23publicclassTeacher{publicvoidgiveLesson(){System.out.println(知识点讲解);System.out.println(总结提问);}}publicclassTest{publicstaticvoidmain(String[]args){HQ3hq=newHQ3();hq.judge(newDBTeacher());}}3如何实现多态1、子类重写父类的方法2、编写方法时,使用父类定义的方法3、运行时,根据实际创建的对象类型动态决定使用哪个方法publiccla