《chapter多态性》ppt课件

上传人:tian****1990 文档编号:74454061 上传时间:2019-01-28 格式:PPT 页数:103 大小:979.81KB
返回 下载 相关 举报
《chapter多态性》ppt课件_第1页
第1页 / 共103页
《chapter多态性》ppt课件_第2页
第2页 / 共103页
《chapter多态性》ppt课件_第3页
第3页 / 共103页
《chapter多态性》ppt课件_第4页
第4页 / 共103页
《chapter多态性》ppt课件_第5页
第5页 / 共103页
点击查看更多>>
资源描述

《《chapter多态性》ppt课件》由会员分享,可在线阅读,更多相关《《chapter多态性》ppt课件(103页珍藏版)》请在金锄头文库上搜索。

1、第6章 多态性,本章知识点,多态性 继承层次结构中子类对象和父类对象间的关系 抽象类和抽象方法的声明和使用 接口的声明和实现 实现多态性的编程技术 final修饰符 内部类与事件处理 基本数据类型的包装类,6.1 多态性概念和实例,多态性(Polymorphism) 在父类中定义的行为,被子类继承之后,表现出不同的行为。 效果:同一行为在父类及其各个子类中具有不同的语义。,【例6-1】多态性举例,Shape shape; shape.draw(); shape指向的对象不同,画出图形也不同(文字、圆或矩形) 多态性也泛指在程序中同一个符号在不同的情况下具有不同解释的现象。,【例6-1】多态性举

2、例,public class Test public static void main(String args) Shape shape; shape = new Shape(); shape.draw(); ,shape = new Circle();,shape = new Rectangle();,6.2 继承层次结构中对象间的关系和类型转换,准则 定理1 定理2 类型转换 子类-父类 父类-子类,对象间的关系,准则1:继承层次结构中的子类对象可以视为父类对象,可以将子类对象赋给父类引用变量。,public class Test public static void main(Strin

3、g args) Shape shape ; shape = new Rectangle(); shape.draw(); ,对象间的关系,定理:如果把子类对象当作父类对象看待,那么就只能调用父类中已有的方法。,对象间的关系,定理:如果子类方法把父类方法覆盖了,再把子类对象当作父类对象来看,去调用该方法,调用的是覆盖之后的方法(子类中定义的方法)。,public class Test public static void main(String args) Shape shape ; shape = new Rectangle(); shape.draw(); ,对象间的关系,举例,Bird b

4、 =new Bird(“bird1“, 4); b.move(); b.sing(); b.eat();,Animal a1=new Animal(“animal1“,20); a1.move(); a1.eat();,Animal a2=new Bird(“bird2“,4); a2.sing(); a2.eat(); a2.move();,/出错,父类中没有该方法,/执行子类move方法,/执行父类eat方法,子类对象赋给父类引用后的3个层次,(1)父类中没有的方法(如sing()方法)不能调用。,(2)如果子类没有覆盖父类的方法(如eat()方法),则调用父类的方法。,(3)如果子类覆盖

5、父类的方法(如move()方法),则调用子类的方法。,对象间的关系,JVM调用方法的过程 编译器查看对象的声明类型和方法名,找出所有可能被调用的候选方法。 编译器查看调用方法时提供的参数类型,如果存在一个参数类型和个数完全匹配的方法,则调用该方法-重载解析。 如果方法是private、static、final、构造方法,则编译器可以准确地获悉应该调用哪个方法并进行调用-静态绑定。否则,将进行动态绑定。 当程序运行、并采用动态绑定调用方法时,JVM一定调用与当前对象的实际类型最合适的那个类的方法。,对象间的关系,动态绑定的作用:无需对现存的代码进行修改,就可以对程序进行扩展。 举例,对象的类型转

6、换,Java编译器允许在具有直接或间接继承关系的类之间进行类型转换。 子类对象-父类对象(向上转型) 父类对象-子类对象(向下转型),对象的类型转换,向上转型:将引用变量转换为父类类型。 举例 Bird bird = new Bird(); Animal animal = bird;,向上转型可以直接进行,因为子类的对象一定能看做父类的对象。,对象的类型转换,向上转型的应用 动态绑定,实现多态,提高程序的扩展性。 举例 Object是所有类的父类。定义类时如果没有extends,则都继承自Object。所以,任何类型的类引用变量都可以转换为Object类型。 Animal animal = n

7、ew Animal(); Object object = animal ;,对象的类型转换,向下转型:将父类引用变量转换为子类类型。 举例 Animal animal = new Bird(); Bird bird = (Bird)animal;,向下转型必须使用强制类型转换;且必须在有意义的情况下才能进行。,对象的类型转换,系统对向下转型的处理 编译器:编译器只检查语义。 Bird bird = (Bird) xxx; 无论xxx是哪种类型,编译器都不会报错。编译器对于强制类型转换一律放行。 JVM:程序运行时,如果不能进行转换,则JVM报ClassCastException异常。 Anim

8、al animal = new Animal(); Bird bird = (Bird)animal;,Bird bird = (Bird)animal; /编译无错,运行出错,在做强制类型转换前,应使用instanceof运算判断引用变量的类型!,if(xxx instanceof Bird) Bird bird=(Bird) xxx;,对象的类型转换,Animal a=new Fish(); Animal b=new Bird(); Animal c=new Animal(); if( a instanceof Animal) ? if( b instanceof Animal) ? if

9、( c instanceof Animal) ? if( a instanceof Bird) ? if( b instanceof Fish) ? if( c instanceof Fish) ?,【例6-2】向下强制转换举例,重写Object类中的equals()方法。 equals()方法是Object类的公有方法。 功能:比较参数所指定的对象是否与当前对象“相等”。 查看JDK的原码 src.zip/java/lang/Object.java。 equals()相等的依据:对于任何非空引用变量x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法返回 true。,public bo

10、olean equals(Object obj) return (this = obj); ,【例6-2】向下强制转换举例,public class EqualsTest public static void main(String args) Animal a1=new Animal(); a1.setName(“animal“); a1.setAge(10); Animal a2= a1; System.out.println(“a1:“+a1); System.out.println(“a2:“+a2); System.out.println(“a1=a2?“+a1.equals(a2)

11、; ,public boolean equals(Object obj) return (this = obj); ,Animal a3 = new Animal(“animal“,10);,System.out.println(“a1=a3?“+a1.equals(a3);,如何利用equals方法比较对象的内容?,System.out.println(“a3:“+a3);,【例6-2】向下强制转换举例,Animal类对象相等的条件是name和age都相同。,public boolean equals(Object obj) if( obj instanceof Animal ) Anima

12、l animal = (Animal)obj; return this.name= animal.name ,向下转型,public boolean equals(Object obj) return (this = obj); ,public class EqualsTest public static void main(String args) Animal a1=new Animal(“animal”,10); Animal a2=new Animal(“animal”,10); System.out.println(“a1=a2?“+a1.equals(a2); ,动态绑定,思考,A

13、nimal a=new Bird(); a能调用哪些方法? Bird b=(Bird) a; b可以调用哪些方法?,6.3 抽象类和抽象方法,6.3.1 抽象类的概念 6.3.2 抽象方法的声明 6.3.3 抽象类的声明 6.3.4 抽象类程序设计的举例,6.3.1 抽象类的概念,抽象类:至少包含一个抽象方法的类。 抽象方法:没有实现的方法,由abstract修饰。它的实现交给子类根据自己的情况去实现。 抽象方法的现实意义(用处) 类在抽象层次上是比较高的,虽然有某些行为,但行为方式不能确定,或者有很多表现形式。 例如:Animal类中的move()应该是抽象方法,在Animal层次上move

14、是一个抽象的行为,不能确定。如果定义Bird类,则move方法是具体的。,6.3.1 抽象类的概念,抽象类涉及的问题 抽象类中包含抽象方法 ,由abstract修饰。 public abstract class Shape . 抽象类只能作为继承层次结构中的父类,仅仅指定子类的共同点,不能创建对象。定义抽象类的目的是提供一个合适的父类,以派生其他类。 抽象类有构造方法。即使不写,系统自动加上一个无参构造方法。,6.3.2 抽象方法的声明,抽象方法 用关键字abstract声明抽象方法 public abstract void draw(); 抽象方法不提供实现。包含抽象方法的类必须声明为抽象类

15、。 抽象父类的所有具体子类都必须为父类的抽象方法提供具体实现;否则其仍然为抽象类。 静态方法、私有方法、final方法、构造方法不能被声明为抽象方法。,6.3.3 抽象类的声明,抽象类与多态 抽象父类不能实例化,但可以使用抽象父类来声明引用变量,用以保存抽象类所派生的任何具体类的对象。程序通常使用这种变量来多态地操作子类对象。,【例6-3】抽象类的程序设计1,【例6-3】抽象类的程序设计1,public abstract class Shape private String name; public Shape() public Shape(String name) this.name = n

16、ame; public String getName() return name; public abstract double getArea(); ,public abstract double getArea(); /抽象方法,【例6-3】抽象类的程序设计1,public class Circle extends Shape private double r; public Circle(String name, double r) super(name); this.r = r; public double getArea() return Math.PI*r*r; ,public class Rectangle extends Shape private double length, width

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号