在面向对象程序设计中多态是一个非常重要的特性,理解多态有利于进行面向对象的分析与设计。
发生多态要有三个前提条件:
继承。多态发生一定要子类和父类之间。
覆盖。子类覆盖了父类的方法。
声明的变量类型是父类类型,但实例则指向子类实例。
如图所示,父类Figure(几何图形)类有一个onDraw(绘图) 方法,Figure(几何图形)它有两个子类Ellipse(椭圆形)和Triangle(三角形),Ellipse和Triangle覆 盖onDraw方法。Ellipse和Triangle都有onDraw方法,但具体实现的方式不同。
示例代码:
public class Figure { public void onDraw(){ System.out.println("绘制。。"); } } class Ellispe extends Figure{ @Override public void onDraw() { System.out.println("绘制椭圆"); } } class Triangle extends Figure{ @Override public void onDraw() { System.out.println("绘制长方形"); } } class Test{ public static void main(String[] args) { // f1变量是父类型,指向父类型 Figure f1 = new Figure(); f1.onDraw(); // f1变量指向父类型,指向子类实例,发生多态 Figure f2 = new Ellispe(); f2.onDraw(); // f3变量指向父类型,指向子类实例,发生多态 Figure f3 = new Triangle(); f3.onDraw(); // f4指向子类型,指向子类实例 Triangle f4 = new Triangle(); f4.onDraw(); } }
运行结果:
绘制。。 绘制椭圆 绘制长方形 绘制长方形
从运行结果可知,多态发生时,Java虚拟机运行时根据引用变量指向的实例调用它的方法,而不是根 据引用变量的类型调用。
在继承层次中,把子类对象赋给父类引用后注意事项:
- 父类中没有的方法不能调用
- 子类没有重写的方法,执行父类的方法行为
- 子类重写的方法,执行子类的方法行为