第六章多态性
学习目标
理解多态性的概念
理解继承层次结构中对象间的关系
区分抽象类与具体类
抽象类和抽象方法的声明和使用
接口的声明和实现
final类和final方法
嵌套类的概念和使用
基本数据类型的包装类
多态性概念和实例
多态性(Polymorphism)是指在超类中定义的属性或行为,被子类继承之后,可以具有不同的数据类型或表现出不同的行为。这使得同一个属性或行为在超类及其各个子类中具有不同的语义。
例如:定义一个几何图形类Shape,它具有“画图”行为,用draw()表示。但具体画什么图并不确定;定义Shape类的一些子类如Circle圆和Rectangle矩形。在子类中“画图”的具体行为可重新定义为:圆类中draw()画圆,矩形类中draw()画矩形。定义Shape s;s作为引用变量可指向Circle圆类的对象,也可指向Rectangle矩形类的对象。通过执行下面的代码:
(); //s调用draw()方法,s指向对象不同会画出不同的图形(圆或矩形)
多态性也是泛指在程序中同一个符号在不同的情况下具有不同解释的现象。
多态性概念和实例(续)
实现多态性的条件:
继承
抽象方法
引用
继承层次结构中对象间的关系
继承层次结构中的子类对象可以视为超类的对象,这样就可以将子类对象赋给超类变量。尽管子类对象的类型不同,但这么做是允许的,因为每个子类对象就是超类的对象。
然而,超类对象并不是其任何子类的对象,即不能将超类对象赋给子类引用。
继承层次结构中对象间的关系(续)
例如
Point3 point = new Point3( 30, 50 );
Circle4 circle = new Circle4( 120, 89, );
Point3 pointRef = circle; (允许)
Point3 pointRef=new Circle4(120,12,0) (允许)
(); //call ();
pointRef=point;
() //call ();
Circle circle= point; // 不允许,编译出错
下列语句组是将point对象强制转换成Circle对象,circle. getX() 语句是正确的,而circle. getRadius()语句在运行时会产生错误。因为circle引用指向的point对象根本无getRadius方法。
Circle circle=(Circle) point;
circle. getX() ;
circle. getRadius() ; //run-time error
例6-1中的例子举例说明了继承层次结构中对象间的关系。
例6-2 超类对象的引用赋给一个子类类型的变量
继承层次结构中对象间的关系(续)
抽象类和抽象方法
抽象类和具体类的概念
抽象方法的声明
抽象类的声明
抽象类程序设计的举例
抽象类和具体类的概念
每个抽象类中至少包含一个抽象方法。
抽象类只能作为继承层次结构中的超类,所以这些类称为抽象超类。不能实例化抽象类的对象。
抽象类的目的是提供一个合适的超类,以派生其他类。
用于实例化对象的类称为具体类。这种类实现它们声明的所有方法。抽象超类是一般类,它们仅仅指定子类的共同点,并不创建出真实的对象。在创建对象之前,我们需要更为专业化的类。
例如,如果我们要“绘制形状”,那我们将绘制什么形状呢?具体类为实例化对象提供了合理的细节。
抽象方法的声明
使用关键字abstract声明抽象方法,形如:
public abstract void draw();
抽象方法并不提供实现。包含抽象方法的类必须声明为抽象类。抽象超类的所有具体子类都必须为超类的抽象方法提供具体实现。
java面向对象程序设计课件 来自淘豆网m.daumloan.com转载请标明出处.