《Java面向对象程序设计(第4版)》课件chapter06 多态性.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《《Java面向对象程序设计(第4版)》课件chapter06 多态性.ppt》由用户(momomo)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Java面向对象程序设计第4版 Java面向对象程序设计第4版课件chapter06 多态性 Java 面向 对象 程序设计 课件 chapter06
- 资源描述:
-
1、学习目标学习目标n理解多态性的概念n理解继承层次结构中对象间的关系n区分抽象类与具体类n抽象类和抽象方法的声明和使用n接口的声明和实现nfinal类和final方法n嵌套类的概念和使用n基本数据类型的包装类6.1 6.1 多态性概念和实例多态性概念和实例 n多态性(Polymorphism)n在超类中定义的属性或行为,被子类继承之后,可以具有不同的数据类型或表现出不同的行为。n这使得同一个属性或行为在超类及其各个子类中具有不同的语义。定义Shape s;s.draw(g);/s调用draw()方法,s指向对象不同会画出不同的图形(圆或矩形或三角形)n多态性也是泛指在程序中同一个符号在不同的情况
2、下具有不同解释的现象。Circledraw()draw()Triangle Rectangledraw()draw()Shapevoid draw();draw()draw()6.1 6.1 多态性概念和实例多态性概念和实例 6.1 多态性概念和实例(续)多态性概念和实例(续)n实现多态性的条件:n继承n抽象方法n引用Shape(抽象类)public abstract void draw();Circle public void draw()./画圆 Rectanglepublic void draw()./画矩型 Shape s;Circle c1=new Circle();Rectangl
3、e r1=new Rectangle();s=c1;s.draw();/画圆 s=r1;s.draw();/画矩型 6.2 继承层次结构中对象间的关系继承层次结构中对象间的关系n继承层次结构中的子类对象可以视为超类的对象,这样就可以将子类对象赋给超类变量。n然而,超类对象并不是其任何子类的对象,即不能将超类对象赋给子类引用。6.2 继承层次结构中对象间的关系(续)继承层次结构中对象间的关系(续)例如:Point3 point=new Point3(30,50);Circle4 circle=new Circle4(120,89,2.7);Point3 pointRef=circle;(允许)P
4、oint3 pointRef=new Circle4(120,12,0)(允许)pointRef.toString();/call Circle4.toString();pointRef=point;pointRef.toString()/call Point.toString();Circle circle=point;/不允许,编译出错 Circle4Point3与引用变量指向的对象相关n强制类型转换Point3 point=new Point3(30,50);Circle circle=(Circle)point;circle.getX();circle.getRadius();/run
5、-time error将point对象强制转换成Circle对象,circle.getX()语句是正确的,而circle.getRadius()语句在运行时会产生错误。因为circle引用指向的point对象无getRadius方法。例6-1:举例说明了继承层次结构中对象间的关系。6.2 继承层次结构中对象间的关系继承层次结构中对象间的关系(续)(续)/Point3.javapublic class Point3 private int x;/将超类中的成员变量x声明为private private int y;/将超类中的成员变量x声明为private public Point3()publ
6、ic Point3(int xValue,int yValue)x=xValue;y=yValue;public String toString()return +getX()+,+getY()+;/Circle3.javapublic class Circle3 extends Point3 private double radius;public Circle3()public Circle3(int xValue,int yValue,double radiusValue)super(xValue,yValue);/显式调用超类的构造方法 setRadius(radiusValue);.
7、public String toString()/调用超类的toString方法 return Center=+super.toString()+;Radius=+getRadius();/HierarchyRelationshipTest1.javaimport javax.swing.JOptionPane;public class HierarchyRelationshipTest1 public static void main(String args)Point3 point=new Point3(30,50);Circle3 circle=new Circle3(120,89,2.
8、7);String output=Call Point3s toString with superclass+reference to superclass object:n+point.toString();output+=nnCall Circle3s toString with subclass+reference to subclass object:n+circle.toString();Point3 pointRef=circle;/子类对象的引用赋给一个超类类型的变量 output+=nnCall Circle3s toString with superclass+referen
9、ce to subclass object:n+pointRef.toString();JOptionPane.showMessageDialog(null,output);System.exit(0);例6-2 超类对象的引用赋给一个子类类型的变量,引起错误。/HierarchyRelationshipTest2.javapublic class HierarchyRelationshipTest2 public static void main(String args)Point3 point=new Point3(30,50);Circle3 circle;circle=point;/超
10、类对象的引用赋给一个子类类型的变量,是不允许的。6.3 6.3 抽象类和抽象方法抽象类和抽象方法 n6.3.1 抽象类和具体类的概念 n6.3.2 抽象方法的声明 n6.3.3 抽象类的声明 n6.3.4 抽象类程序设计的举例 6.3.1 抽象类和具体类的概念抽象类和具体类的概念n抽象类抽象类abstract:每个抽象类抽象类中至少包含一个抽象方法。n抽象类只能作为继承层次结构中的超类,所以这些类称为抽象超类。不能实例化抽象类的对象。n抽象类的目的:提供一个合适的超类,以派生其他类。n具体类具体类concrete:用于实例化对象的类。这种类实现它们声明的所有方法所有方法。n抽象超类是一般类,它
11、们仅仅指定子类的共同点,并不创建出真实的对象。例如,如果我们要“绘制形状”,那我们将绘制什么形状呢?具体类为实例化对象提供了合理的细节。6.3.2 抽象方法的声明抽象方法的声明n用关键字abstract声明抽象方法:public abstract void draw();抽象方法并不提供实现。包含抽象方法的类必须声明为抽象类。抽象超类的所有具体子类都必须为超类的抽象方法提供具体实现。6.3.3 抽象类的声明抽象类的声明n使用关键字abstract声明抽象类。形如:public abstract class Shape.抽象类通常包含一个或多个抽象方法(静态方法不能为抽象方法)。n抽象超类不能实
12、例化。但可以使用抽象超类来声明引用变量,用以保存抽象类所派生的任何具体类的对象。程序通常使用这种变量来多态地操作子类对象。6.3.4 抽象类程序设计的举例抽象类程序设计的举例 例6-3 抽象类的程序设计示例该例子所使用到的类的层次结构如图6-1所示。类的层次以抽象超类Shape为开始,派生出Point类,然后由Point类派生出Circle类,再由Circle类派生出Cylinder类。其中Shape以斜体字出现表示它是抽象类。图6-1 Shape类的层次结构/Shape.javapublic abstract class Shape extends Object /定义Shape为抽象类 p
13、ublic double getArea()return 0.0;public double getVolume()return 0.0;public abstract String getName();/定义getName为抽象方法/Point.javapublic class Point extends Shape private int x;private int y;public Point()public Point(int xValue,int yValue)x=xValue;y=yValue;.public String getName()/覆盖覆盖Shape类中的类中的getN
14、ame方法方法 return Point;public String toString()return +getX()+,+getY()+;/Circle.javapublic class Circle extends Point private double radius;public Circle()public Circle(int x,int y,double radiusValue)super(x,y);setRadius(radiusValue);.public String getName()return Circle;public String toString()return
15、 Center=+super.toString()+;Radius=+getRadius();/Cylinder.javapublic class Cylinder extends Circle private double height;public Cylinder()public Cylinder(int x,int y,double radius,double heightValue)super(x,y,radius);setHeight(heightValue);.public String getName()return Cylinder;public String toStrin
16、g()return super.toString()+;Height=+getHeight();/AbstractInheritanceTest.javaAbstractInheritanceTest.javapublic class AbstractInheritanceTest public class AbstractInheritanceTest public static void main(String args)public static void main(String args)DecimalFormat twoDigits=new DecimalFormat(0.00);D
17、ecimalFormat twoDigits=new DecimalFormat(0.00);Point point=new Point(7,11);Point point=new Point(7,11);Circle circle=new Circle(22,8,3.5);Circle circle=new Circle(22,8,3.5);Cylinder cylinder=new Cylinder(20,30,3.3,10.75)Cylinder cylinder=new Cylinder(20,30,3.3,10.75);String output=String output=poin
18、t.getName()point.getName()+:+:+point point+n+n+circle.getName()circle.getName()+:+:+circle circle+n+n+cylinder.getName()cylinder.getName()+:+:+cylindercylinder+n;+n;Shape arrayOfShapes=new Shape 3;Shape arrayOfShapes=new Shape 3;/声明声明ShapeShape类型的数组类型的数组 arrayOfShapes 0 =pointarrayOfShapes 0 =point;
19、/将将PointPoint对象的引用对象的引用pointpoint赋给赋给ShapeShape类型的数组元素类型的数组元素1 1 arrayOfShapes 1 =circle;arrayOfShapes 1 =circle;/将将CircleCircle对象的引用对象的引用circlecircle赋给赋给ShapeShape类型的数组元素类型的数组元素2 2 arrayOfShapes 2 =cylinderarrayOfShapes 2 =cylinder;/将将CylinderCylinder对象的引用对象的引用cylindercylinder赋给赋给ShapeShape类型的数组元素类
20、型的数组元素3 3for(int i=0;i arrayOfShapes.length;i+)for(int i=0;i arrayOfShapes.length;i+)output+=nn+output+=nn+arrayOfShapes i.getName()arrayOfShapes i.getName()+:+:+arrayOfShapes i.toString()arrayOfShapes i.toString()+nArea=+nArea=+twoDigits.format(+twoDigits.format(arrayOfShapes i.getArea()arrayOfShap
21、es i.getArea()+nVolume=+nVolume=+twoDigits.format(+twoDigits.format(arrayOfShapes i.getVolume()arrayOfShapes i.getVolume(););JOptionPane.showMessageDialog(null,output);JOptionPane.showMessageDialog(null,output);6.4 接口的声明和实现接口的声明和实现 n6.4.1 接口的概念 n6.4.2 接口的声明n6.4.3 接口的实现n6.4.4 接口的程序设计举例 6.4.1 接口的概念接口的
22、概念n接口:用于声明一组类的公共操作的接口。n接口由常量和一组抽象方法组成。接口中不包括变量和有具体实现的方法。接口只是声明了功能是什么(方法头),而并没有定义如何实现这个功能,功能的实现(即方法体)是在继承这个接口的各个子类中完成的.n接口支持多重继承,nJava把对接口功能的继承称为“实现(implement)”。n接口与抽象类到底有什么区别:(1)接口不能实现任何方法,而抽象类可以。(2)类可以实现许多接口,但只有继承一个父类。(3)接口不是类分级结构的一部分,没有联系的类可以实现相同的接口。6.4.1 接口的概念(续)接口的概念(续)6.4.2 接口的声明接口的声明n定义接口的一般格式
23、如下:public interface 接口名 extends 父接口名列表 /常量声明 public final static 类型 变量名=常量值;/抽象方法声明 public abstract 返回类型 方法名(参数列表);接口支持多重继承:public interface Shape public final static double PI=3.1416;public abstract void draw(Graphics g);6.4.2 接口的声明接口的声明(续续)6.4.3 接口的实现接口的实现n为了声明一个类来实现一个接口,在类的声明中要包括一条implements语句。cl
24、ass ClassName extends ParentClass implements interface1,interface2 /接口中方法的实现6.4.4 接口的程序设计举例接口的程序设计举例该例子中各类之间的层次关系如图6-1,仅仅区别在于用接口Shape替代了抽象超类Shape。例6-4接口程序设计示例public interface Shape /声明了Shape接口 public double getArea();/声明getArea方法 public double getVolume();/声明getVolume方法 public String getName();/声明ge
25、tName方法Shape类的层次结构/Point.javapublic class Point extends Object implements Shape private int x;private int y;public Point()public Point(int xValue,int yValue)x=xValue;y=yValue;.public double getArea()/实现Shape接口中的getArea方法 return 0.0;public double getVolume()/实现Shape接口中的getVolume方法 return 0.0;public S
展开阅读全文