Java程序设计教程及实验指导 课件第4章 继承与多态性.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《Java程序设计教程及实验指导 课件第4章 继承与多态性.ppt》由用户(momomo)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Java程序设计教程及实验指导 课件第4章 继承与多态性 Java 程序设计 教程 实验 指导 课件 继承 多态性
- 资源描述:
-
1、4.1 继承的基本概念 顾名思义,继承就是子将父的东西承接过来。动动物物食食草草动动物物食食肉肉动动物物牛牛马马狮狮子子老老虎虎图4-1 动物类别之间的继承【提示提示】继承需要符合IS-A(是一种)关系,也就是子类是父类的一种,如老虎是食肉动物的一种。Java继承的特点 1)继承关系是传递的。若类C继承类B,类B继承类A,则类C既有从类B那里继承下来的属性与方法,也有从类A那里继承下来的属性与方法,还可以有自己新定义的属性和方法。2)继承简化了人们对事物的认识和描述,能清晰体现相关类间的层次结构关系。3)继承提供了软件复用功能。若类B继承类A,那么建立类B时只需要再描述与基类(类A)不同的少量
2、特征(数据成员和成员方法)即可。这种做法能减小代码和数据的冗余度,大大增加程序的重用性。4)继承通过增强一致性来减少模块间的接口和界面,大大增加了程序的易维护性。4.2 Java继承的实现 4.2.1 继承的语法 在Java中使用extends关键字实现继承关系,格式如下:访问控制方式 class extends ./成员定义4.2.1 继承的语法【实例实例4-1】继承的使用继承的使用class Personprivate String name;/姓名private int age;/年龄public String getName()return name;public void setNa
3、me(String name)this.name=name;public int getAge()return age;public void setAge(int age)this.age=age;class Student extends Personprivate String school;/学校private int grade;/年级public String getSchool()return school;public void setSchool(String school)this.school=school;public int getGrade()return grad
4、e;public void setGrade(int grade)this.grade=grade;4.2.1 继承的语法public class InheritDemo public static void main(String args)Student stu=new Student();/新建学生对象stu.setName(张三);/访问从父类继承的方法stu.setAge(20);/访问从父类继承的方法stu.setSchool(哈佛大学);/访问本类定义的方法stu.setGrade(2);/访问本类定义的方法 System.out.println(姓名:+stu.getName(
5、)+,年龄:+stu.getAge()+学校:+stu.getSchool()+,年级:+stu.getGrade();4.2.1 继承的语法子类虽然继承了父类的私有成员,但在子类中不能直接访问的示例如下:图4-3 编译出错4.2.2 protected访问控制方式 父类和子类是一般类和特殊类关系,子类是需要扩展父类的功能的,在扩展父类的功能时,可能会需要使用到从父类继承的私有成员,但父类的私有成员,在子类中不能直接访问。为此,Java提供了protected访问控制方式来解决这个问题。protected访问控制方式介于private和public之间,用用protected修饰的类里修饰的类
6、里的成员,向所有子类和同一个包的其它类开放其的成员,向所有子类和同一个包的其它类开放其访问权限。访问权限。把Person类的name的访问控制方式修改为protected:class Personprotected String name;/姓名 .class Student extends Person.public void printName()System.out.println(name=+name);付出了增加类之间耦合性的代价。专家们的建议是把类中的属性都定义成private的,然后设置访问方法为public或protected的。4.2.3 super关键字与子类对象实例化过程
7、 子类对象实例中这些继承下来的非静态数据成员所占用的内存区域为子类对象实例中的父类子对象。注意父类子对象本身相当于一个父类对象实例。Java 语言的每一语言的每一个对象实例也有一个特殊的私有数据成员,个对象实例也有一个特殊的私有数据成员,称为称为super,用来引用该父类子对象。,用来引用该父类子对象。super 也是一个引用变量,其类型则是它所属的对象实例的父类类型。4.2.3 super关键字与子类对象实例化过程【实例实例4-2】子类对象实例化class Personpublic Person()System.out.println(我是Person类的构造方法);class Studen
8、t extends Personpublic Student()System.out.println(我是Student类的构造方法);public class SuperDemo1 public static void main(String args)Student stu=new Student();/新建学生对象程序运行结果如下:我是Person类的构造方法我是Student类的构造方法4.2.3 super关键字与子类对象实例化过程【实例实例4-3】super关键字class Personprivate String name;/姓名private int age;/年龄public
9、 Person(String name,int age)this.name=name;this.age=age;public String getName()return name;public int getAge()return age;4.2.3 super关键字与子类对象实例化过程class Student extends Personprivate String school;/学校private int grade;/年级public Student(String name,int age,String school,int grade)super(name,age);/调用父类构
10、造方法,初始化从父类继承的对象属性this.school=school;this.grade=grade;public String getSchool()return school;public int getGrade()return grade;4.2.3 super关键字与子类对象实例化过程public class SuperDemo2 public static void main(String args)Student stu=new Student(张三,20,哈佛大学,2);/新建学生对象 System.out.println(姓名:+stu.getName()+,年龄:+st
11、u.getAge()+学校:“+stu.getSchool()+,年级:+stu.getGrade();程序运行结果如下:姓名:张三,年龄:20 学校:哈佛大学,年级:24.2.4 方法重写(Override)方法重写也称为方法覆盖或方法重定义方法重写也称为方法覆盖或方法重定义 class Vehicle public void run()System.out.println(交通工具在跑!);class Truck extends Vehicle Override /表示方法重写的Java注解public void run()System.out.println(货车在地上跑!);class
12、 Airplane extends Vehicle Override /表示方法重写的Java注解public void run()System.out.println(飞机在天上飞!);提示提示:子类不能重写父类的static方法。方法重写应遵循以下原则:1.重写的方法不能比父类被重写的方法产生更多的异常;(注:有关异常见第5章。)2.重写的方法不能比父类被重写的方法有更严格的访问权限。4.2.5 final关键字 final在Java中表示最终的意思,使用final可以声明类、属性和方法:1)使用final可以声明常量,常量不能修改,定义时要赋初值;例如:final int NUM=0;2
13、)使用final声明的方法不能被子类重写;3)使用final声明的类不能有子类。4.3 继承与子类型 类A继承类B,则类型A是类型B的子类型。Java语言允许祖先类类型的引用变量指向后代类语言允许祖先类类型的引用变量指向后代类类型的对象。类型的对象。例如,类GraduateStudent是类Student的子类,下述语句是合法的:Student s=new GraduateStudent();类似的如果一个方法的形参是超类类型,那么方法调用时可以传给它一个子类对象作为实参,例如对于一个方法void f(Student d);可以这样来调用它:GraduateStudent s=new Grad
14、uateStudent();f(s);/子类对象作为实参4.4 抽象类与多态性 4.4.1 抽象类的引入 抽象类往往用来表征我们在对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。4.4.2 抽象方法 在抽象类中创建的没有具体实现的,必须要子类重写的方法称为抽象方法。抽象方法用关键字abstract进行修饰,这种方法只声明返回的数据类型、方法名称和所需的参数,没有方法体,也就是说抽象方法只需要声明而不需要实现。声明一个抽象方法的基本格式如下:abstract (参数列表);例如:abstract void f();4.4.3 抽象类的定义【实例实例
15、4-4】如何定义抽象类及抽象方法示例abstract class Fruit /定义抽象类public String color;/定义颜色成员变量public Fruit()/定义构造方法color=绿色;/对变量color进行初始化public abstract void harvest();/定义抽象方法class Apple extends Fruit Overridepublic void harvest()System.out.println(苹果已经收获!);4.4.3 抽象类的定义class Orange extends Fruit Overridepublic void ha
16、rvest()System.out.println(桔子已经收获!);public class AbstractClassDemo public static void main(String args)Fruit f1=new Apple();/父类引用指向子类对象f1.harvest();/通过父类引用调用子类对象的重写方法f1=new Orange();f1.harvest();程序运行结果如下:苹果已经收获!桔子已经收获!4.4.4 多态性(Polymorphism)“Polymorphism(多态)”一词来自希腊语,意为“多种形式”。指的是一个程序中同名的不同方法共存的情况。多态有编
17、译时(静态)多态和运行时(动态)多态。编译时多态是通过方法重载实现的;运行时多态是通过方法覆盖实现(子类覆盖父类方法)的。4.4.4 多态性(Polymorphism)【实例实例4-5】一个经典的抽象图形类和它的具体子类的例子一个经典的抽象图形类和它的具体子类的例子import java.util.*;abstract class Shape /Shape类是几个具体图形类的抽象父类 public abstract void draw();/定义抽象方法class Rectangle extends Shape /Rectangle类是Shape类的一个具体子类 Override /表示方法重
18、写的Java注解 public void draw()System.out.println(画矩形);4.4.4 多态性(Polymorphism)class Circle extends Shape /Circle类也是Shape类的一个具体子类 Override public void draw()System.out.println(画圆);class ShapeUser/图形类的用户 /传入的实参只能是Shape类的具体子类对象public void showShape(Shape shape)shape.draw();/传入参数对象的draw方法4.4.4 多态性(Polymorph
19、ism)public class ShapeDemo/测试类 public static void main(String args)ShapeUser shapeUser=new ShapeUser();shapeUser.showShape(new Rectangle();/传入方法一个矩形对象 shapeUser.showShape(new Circle();/传入方法一个圆形对象 程序运行结果如下:画矩形画圆形总结一下,实现多态性的步骤如下:1.在抽象类中定义抽象方法;2.在抽象类的具体子类中重写抽象方法;3.让抽象类的对象引用指向具体子类对象;4.通过抽象类的对象引用调用抽象方法,会
20、绑定到具体子类中重写的抽象方法上。4.5 继承的使用要点 1、抽象类是用来继承的,具体类不是用来继、抽象类是用来继承的,具体类不是用来继承的。承的。2、抽象类应当拥有尽可能多的共同代码、抽象类应当拥有尽可能多的共同代码。3、抽象类应当拥有尽可能少的数据。、抽象类应当拥有尽可能少的数据。4.5 继承的使用要点4.5 继承的使用要点4、使用继承的条件。、使用继承的条件。当以下的条件全部被满足时,才应当使用继承关系:(1)继承代表“一般/特殊”关系,其中超类代表一般,而子类代表特殊,子类是超类的一个特殊种类,而不是超类的一个角色,也就是要区分“Has-A”与“Is-A”两种关系的不同。Has-A关系
21、应当使用聚合描述,而只有Is-A关系才符合继承关系。(2)子类具有扩展超类的责任,而不是具有注销掉(Nullify)超类特性的责任。(3)只有从分类学角度上有意义时,才可以使用继承,不要从工具类继承。4.5 继承的使用要点4.6 instanceof运算符 例如,Manager和Contractor都是抽象类Employee的子类 public void method(Employee e)if (e instanceof Manager)/do something as a Manager else if(e instanceof Contractor)/do something as a
22、Contractor 然而,这种做法通常被认为是没有好好利用面向对象中的多然而,这种做法通常被认为是没有好好利用面向对象中的多态性,这样的设计实际很糟糕,代码难以维护。态性,这样的设计实际很糟糕,代码难以维护。【实例实例4-6】使用多态性计算员工工资的例子。abstract class Employee/雇员抽象类public abstract void pay();/计算工资的抽象方法public void method()/发工资的方法pay();/会自动绑定到调用对象的pay方法class Manager extends Employee/经理类Overridepublic void p
23、ay()System.out.println(发给经理工资5000元);class Contractor extends Employee/合同工类Overridepublic void pay()System.out.println(发给合同工工资3000元);public class SalaryDemo public static void main(String args)Employee employee=new Manager();employee.method();employee=new Contractor();employee.method();程序运行结果如下:发给经理工
24、资5000元发给合同工工资3000元4.7 Object类 4.7.1 基本作用 Object 类是Java 类层中的最高层类,是所有类的超类。所有的类构成了一棵以Object类为顶点的继承树。结果是所有的类都继承了Object类声明的接口和方法,这一特性在程序设计中有举足轻重的作用,可以使用这种“通用”对象类型进行“通用”程序设计,所以在很多类库设计上都采用Object类型作为方法的参数类型。4.7 Object类4.7.2 主要方法 1、equals()方法方法用于测试某个对象是否同另一个对象相等。它在Object类中的实现是判断两个对象是否指向同一块内存区域(直接用“=”进行比较)。2、
25、toString()方法方法返回该对象的字符串表示。3、finalize()方法方法当垃圾回收器将要释放无用对象的内存时,先调用该对象的finalize方法。4.8 基本类型的包装类 序号序号基本数据类型基本数据类型包装类包装类1byteByte2booleanBoolean3shortShort4charCharacter5intInteger6longLong7floatFloat8doubleDouble4.8 基本类型的包装类对于包装类说,这些类的用途主要包含两种:作为和基本数据类型对应的类类型存在,方便涉及到对象的操作。包含每种基本数据类型的相关属性如最大值、最小值等,以及相关的操作
展开阅读全文