Java多态

简介

同一方法作用于不同类的实例,将产生不同的执行结果。即"一个对外接口的方法有多种表现形式"。
当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,再去调用子类的同名方法。
Java中,父类的引用既可以指向父类的对象,也可以指向子类的对象,但子类的引用不能指向父类的对象

必要条件

  • 要有继承(或实现接口)
  • 要有重写
  • 父类引用指向子类对象:Parent p = new Child();

多态优点

  • 可扩充性
  • 接口性
  • 简洁灵活

实现方式

  • 继承父类,重写父类方法
  • 实现接口,重写接口方法

案例

父类Shape:

1
2
3
4
5
public class Shape {
void draw() {
System.out.println("Shape.draw()");
};
}

子类Circle:

1
2
3
4
5
6
7
8
public class Circle extends Shape {
void draw() {
System.out.println("Circle.draw()");
}
void cirCleDraw(){
System.out.println("Circle.cirCleDraw()");
}
}

子类Square:

1
2
3
4
5
6
public class Square extends Shape {
@Override
void draw() {
System.out.println("Square .draw()");
}
}

测试类Test:

1
2
3
4
5
6
public class Test {
public static void main(String[] args) {
Shape s = new Circle(); // 父类引用指向子类对象
s.draw();
}
}

运行结果:
Circle.draw()

注意,用子类引用指向父类对象会报错,父类引用调用子类特有的方法会报错,如下所示:

1
Circle c = new Shape(); // IDEA检测报错
1
2
Shape s = new Circle(); // 父类引用指向子类对象
s.cirCleDraw(); // IDEA检测报错

如有错误,欢迎指正!

参考链接