对多态的理解
有了向上转型,动态绑定和方法重写的了解之后,才能理解多态的形式
首先看看通过使用动态绑定的形式使用不同类中的同名方法
public class muchState {
public static void main(String[] args) {
Shape s1 = new Cycle();
Shape s2 = new Rect();
Shape s3 = new triangle();
drawMap(s1);
drawMap(s2);
drawMap(s3);
}
public static void drawMap(Shape shape){
shape.draw();
}
}
///分割线
class Shape{
public void draw(){
//为重写准备,不写任何内容
}
}
class Cycle extends Shape{
@Override
public void draw() {
System.out.println("⚪");
}
}
class Rect extends Shape{
@Override
public void draw() {
System.out.println("⬜");
}
}
class triangle extends Shape{
@Override
public void draw() {
System.out.println("🔺");
}
}
在代码分割线的上方表示类的调用者,下方表示类的定义
当类的调用者使用drawMap这个方法时,参数类型为Shape,此时在方法的内部并不指导当前shape指向的是哪个子类的实例,因此shape调用draw方法时会出现多种不同的形态,此种行为就称为多态
顾名思义:多态就是一个引用出现多种不同的形态,
public static void drawMap2(){
Shape[] shapes={new Cycle(),new Rect(),new triangle()};
for (Shape shape:shapes) {
shape.draw();
}
///这个函数利用数组和多态的形式更好的实现了函数的功能
//首先,数组为同类元素的集合,在Shape[]数组中可以存储多个Shape类,
//通过利用foreach,设置引用指针访问每个Shape的draw,来打印
}
上述代码如果不使用多态,就需要书写太多的if-else语句,增加了代码的圈复杂度
多态的优点:
1.类的调用者使用成本进一步降低
(1)封装能够让使用者不需要知道类的实现细节
(2)多态能让的调用者连这个类的类型都不必知道,只需要知道这个对象具有某个方法即可
2.能够降低代码的圈复杂度
3.可扩展能力更强使用成本大大降低