1.多态的定义:
同一个对象,在不同时刻,表现出来的不同状态--------父类(接口)引用指向子类(实现类)对象
2.多态的前提条件:
A.有继承或者实现关系
B.有方法的重写
3.多态中的成员使用特点:
Fu fz=new Zi();
多态时,所有的表现形式都是父类的表现形式;
只有调用方法时,运行的是子类重写的方法
A:成员变量
编译看左边,运行看左边
B:成员方法
编译看左边,运行看右边
class Fu {
int num=4;
void show() {
System.out.println("showFu");
}
}
class Zi extends Fu {
int num=5;
void show() {
System.out.println("showZi");
}
}
class Test {
public static void main(String[] args) {
Fu f=new Zi();
System.out.println(f.num);
f.show();
}
运行结果是: 4----showZi
4.多态的利弊
A.利:提高了程序的可维护性和可扩展性
B.弊:不能使用子类特有方法,除非向下转型
5.多态中的转型
A:向上转型
把子类对象赋值给父类(接口)的引用 自动类型提升
int a = 0;
double b =a;
Fu fz = new Zi();
B:向下转型
把父类(接口)的引用强制转换成子类对象
double b = 10.0;
int a = (int)b;
Fu fz = new Zi();
Zi zf = (Zi)fz;
注意:Fu fu = new Fu() 不能向下转型 会报ClassCastException 类型转换异常
6.多态的三种形式
A.具体类的多态 ------父类 变量名 = new 子类();
B.抽象类的多态-------父抽象类 变量名 = new 子类();
C.接口的多态---------接口 变量名 = new 实现类();
7.instanceof关键字
格式: 对象名 instanceof 类名
返回值:true,false
作用:判断指定的对象,是否为给定类创建的对象
Animal a1 = new Cat();
Animal a2 = new Dog();
method(a1);
public static void method(Animal a){
if(a instanceof Cat){
向下转型
调用猫特有方法
}
}