当前位置:
文档之家› 第七章 面向对象的Java实现-继承和多态
第七章 面向对象的Java实现-继承和多态
Java教员
.NET教员
10
为什么需要继承 4-4
public class JavaTeacher2 extends Teacher { public JavaTeacher2(String myName, String mySchool) { super(myName, mySchool); 子类自动继承父类的属 } 性和方法,子类中不再 public void giveLesson(){ 存在重复代码 System.out.println("启动 Eclipse"); super.giveLesson(); } } public class DotNetTeacher2 extends Teacher { public DotNetTeacher2(String myName, String mySchool) { super(myName, mySchool); } public void giveLesson(){ System.out.println("启动 Visual Studio .NET"); super.giveLesson(); } } 使用继承,可以有效实现代码复用
4
本章目标
掌握继承 掌握super关键字 掌握多态
5
生活中的继承 2-1
生活中,继承的例子随处可见
动物 谁是父类? 谁是子类? 能说出继承的特点吗?
食草动物
食肉动物
继承需要符合的关系:is-a,父类更通用、子类更具体
6
生活中的继承 2-2
子类具有父类的一般特性(包括属性和行为), 以及自身特殊的特性
可以接收子类类型 public class HQ3 { public void judge(Teacher t){ t.introduction(); t.giveLesson(); 根据实际创建的对象 } 类型调用相应方法 大家好!我是北京中心的李明. 启动 Eclipse 知识点讲解 总结提问
大家好!我是天津中心的张明. 启动 Visual Studio 2005 public static void main(String[] args) { 知识点讲解 HQ3 hq = new HQ3(); 控制台输出 总结提问 hq.judge(new JavaTeacher2("李明","北京中心“)); hq.judge(new DotNetTeacher2("张明","天津中心")); 大家好!我是北京中心的李岚. hq.judge(new DBTeacher(“李岚","北京中心“)); 启动 Sql Server 知识点讲解 总结提问
15
小结 1
请编码实现动物世界的继承关系:
动物(Animal)具有行为:吃(eat)、睡觉(sleep) 动物包括:兔子(Rabbit),老虎(Tiger) 这些动物吃的行为各不相同(兔子吃草,老虎吃肉);但睡觉 的行为是一致的。
请通过继承实现以上需求,并编写测试类 AnimalTest进行测试。
8
为什么需要继承 4-2
请问:以下这个解决方案中存在着什么问题?
public class DotNetTeacher { private String name; // 教员姓名 public class JavaTeacher { private String name; // 教员姓名 private String school; // 所在中心 private String school; // 所在中心 public DotNetTeacher(String myName, public JavaTeacher(String myName, String mySchool) { String mySchool) { name = myName; name = myName; school = mySchool; school = mySchool; } } public void giveLession(){ System.out.println("启动 Visual public void giveLession(){ System.out.println("启动 Eclipse"); Studio 2005"); System.out.println("知识点讲解"); System.out.println("知识点讲解"); System.out.println("总结提问"); System.out.println("总结提问"); } } public void introduction() { public void introduction() { System.out.println("大家好!我是" System.out.println("大家好!我是" + school + "的" + name + "."); + school + "的" + name + "."); } } } 9 代码存在重复,违背了“write once, only once”的原则 }
12
如何实现继承 3-2
子类自动继承父类的属性和方法,子类中可以 定义特定的属性和方法
public class Teacher { private String name; // 教员姓名 public class JavaTeacher2 extends Teacher private String school;// 所在中心 { public Teacher (String public JavaTeacher2(String myName, myName, String mySchool) { String mySchool) { //初始化属性值 super(myName, mySchool); } } public void giveLesson() { public void giveLesson(){ //授课方法的具体实现 System.out.println("启动Eclipse"); } super.giveLesson(); public void introduction() { } //自我介绍方法的具体实现 } 由于giveLesson()方法与 } 父类的实现有所不同,因 } 父类中的属性和方法可 此重写了该方法 以被子类继承
第七章
面向对象的Java实现-继承和多态
回顾
在Java程序中,代码封装带给我们的好处是什 么? 举例说明什么是方法重载?
Java中的构造方法与实例方法,有什么区别?
2
预习检查
举例说明在什么样的情况下,需要使用到继承? 在Java程序中,多态性带给我们的好处是什么?
3
本章任务
升级Hello,输出5.0教员的基本信息: 使用继承提高代码的复用性 使用多态提高代码的可扩展性及可维护性
11
如何实现继承 3-1
在Java语言中,用extends关键字来表示一个类 继承了另一个类,例如:
public class JavaTeacher2 extends Teacher { //其余代码省略 }
在父类中只定义一些通用的属性与方法,例如:
public class Teacher { private String name; // 教员姓名 private String school; // 所在中心 public Teacher(String myName, String mySchool) { //初始化属性值 } public void giveLesson() { //授课方法的具体实现 } public void introduction() { //自我介绍方法的具体实现 } }
13
方法重写:子类和父类的方法具有相同的名称、参数列表、返回类型
如何实现继承 3-3
子类的构造方法中,通过super关键字调用父类的构造方法
public class JavaTeacher2 extends Teacher { public JavaTeacher2(String myName, String mySchool) { super(myName, mySchool); } 通过调用父类的构造方法, } 完成对属性值的初始化
为什么需要继承 4-3
如何改进?有没有可能建立继承关系,让子类自动继承父 类的属性和方法?
Java教员是教员吗? .NET教员是教员吗? 教员 姓名 所在中心 授课 自我介绍 public class Teacher { private String name; // 教员姓名 private String school; // 所在中心 public Teacher(String myName, 属 String mySchool) { 性 name = myName; 行 school = mySchool; 为 } public void giveLesson(){ System.out.println("知识点讲解"); System.out.println("总结提问"); } public void introduction() { System.out.println("大家好!我是 “ + school + "的" + name + "。"); 现在,所有子类中相同的代 } 码都抽取到父类中了 }
巴士是汽车吗? 卡车是汽车吗? 出租车是汽车吗?
汽车 引擎数量 外观颜色 刹车 加速 属性 行为