简介
同一方法作用于不同类的实例,将产生不同的执行结果。即"一个对外接口的方法有多种表现形式"。
当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,再去调用子类的同名方法。
Java中,父类的引用既可以指向父类的对象,也可以指向子类的对象,但子类的引用不能指向父类的对象。
必要条件
- 要有继承(或实现接口)
- 要有重写
- 父类引用指向子类对象:Parent p = new Child();
多态优点
- 可扩充性
- 接口性
- 简洁灵活
实现方式
- 继承父类,重写父类方法
- 实现接口,重写接口方法
案例
父类Shape:
public class Shape {
void draw() {
System.out.println("Shape.draw()");
};
}
子类Circle:
public class Circle extends Shape {
void draw() {
System.out.println("Circle.draw()");
}
void cirCleDraw(){
System.out.println("Circle.cirCleDraw()");
}
}
子类Square:
public class Square extends Shape {
@Override
void draw() {
System.out.println("Square .draw()");
}
}
测试类Test:
public class Test {
public static void main(String[] args) {
Shape s = new Circle(); // 父类引用指向子类对象
s.draw();
}
}
运行结果:
Circle.draw()
注意,用子类引用指向父类对象会报错,父类引用调用子类特有的方法会报错,如下所示:
Circle c = new Shape(); // IDEA检测报错
Shape s = new Circle(); // 父类引用指向子类对象
s.cirCleDraw(); // IDEA检测报错
如有错误,欢迎指正!