多态性其实就是方法调用的机制,也就是说当在编译时无法确定一个对象的实际类型时,应当能够在运行时基于对象的实际类型来决定调用的具体方法(动态绑定)。
问题
现在有 A B C 三个类 我们如果想要把ABC三个对象都进行传递 这个时候该如何表示呢? 只需要传递时类型规定为三个类共同的父类即可
使用多态
可以实现面向对象的开闭原则 开闭原则: 在程序中我们一般 对扩展进行开放 对修改进行关闭
多态分类
-
向上转型 【多态】 父类 f=new 子类() 父类引用指向子类对象
-
向下转型 【还原】 子类 z=(子类)f 向下转型是不安全的 可能出现类型转换错误
使用场景: A、传参 B、返回值
instanceof:对于类型的判断
注意:
-
多态是方法的多态,不是属性的多态(多态与属性无关)。
-
多态的存在要有3个必要条件:继承/实现,方法重写,父类引用指向子类对象。
-
多态可用的方法一般是子父共有的
多态的表现形式
成员变量 编译看左侧 运行看左侧 //变量没有多态
非静态方法 编译看左侧 运行看右侧----->多态
静态方法 编译看左侧 运行看左侧 //静态绑定无需多态
public class Fu {
public int a=10;
public static int b=20;
public final int c=30;
public void aa(){
System.out.println("父类中aa");
}
public static void bb(){
System.out.println("我是父类中bb");
}
public void cc(){
System.out.println("我是父类中cc");
}
}
public class Zi extends Fu {
public int a=100;
public static int b=200;
public final int c=300;
public int d=400;
public void aa(){
System.out.println("子类中aa");
}
public static void bb(){
System.out.println("我是子类中bb");
}
public void dd(){
System.out.println("子类中dd");
}
}
public static void main(String[] args) {
/*
* 成员变量 编译看左侧 运行看左侧 //变量没有多态
* 非静态方法 编译看左侧 运行看右侧----->多态
* 静态方法 编译看左侧 运行看左侧 //静态绑定无需多态
* */
Fu f=new Zi();
// System.out.println(f instanceof Zi)
System.out.println(f.a);
System.out.println(f.b);
System.out.println(f.c);
//System.out.println(f.d); 报错 编译看左侧
f.aa();
//f.dd();//报错非静态方法 编译看左侧
f.bb();
f.cc();
}
//10
//20
//30
//子类中aa
//我是父类中bb
//我是父类中cc