1、多态的概念:
(1)多态是同一个行为具有不同的表现形式或形态的能力
(2)同一方法可以根据发送对象的不同而采用不同的行为方式
2、多态的实现条件:
(1)在多态中必须存在有继承或实现关系的子类和父类
(2)子类对父类中的某些方法进行重新定义(重写,使用@Override注解进行重写)
(3)基类引用指向派生类对象,即父类引用指向子类对象(父类类型:指子类对象继承的父类类型,或实现的父接口类型)
3、多态的格式:
父类类型 变量名 = new 子类类型();
变量名.方法名();
4、多态中的成员特点:
(1)多态成员变量:编译运行看左边
eg. Animal dog = new Dog();
System.out.println(dog.age) ;
(最后输出的是父类Animal中的值)
(2)多态成员方法:编译看左边,运行看右边
eg. Animal dog = new Dog();
dog.eat();
(最后调用的是子类的方法)
5、多态的特点:
(1)多态情况下,子类和父类存在同名的成员变量时,访问的时父类的成员变量
(2)多态情况下,子父类存在同名的非静态成员方法时,访问的是子类中重写的方法
(3)多态情况下,子父类存在同名的静态成员变量成员方法时,访问的是父类的成员函数
(4)多态情况下,不能访问子类独有的方法
6、引用类型转换:
(1)向上转型(自动转换):多态本身是子类向父类向上转换(自动转换)的过程, 这个过程是默许的,当父类引用指向一个子类对象时,就是向上转型。
eg. 父类类型 变量名 = new 子类类型();
Animal dog = new Dog();
(本质为创建一个子类对象)
(2)向下转型:向下转型是父类向子类转换的过程,这个过程需要强制转换。
Eg. Male m2 = new Male();//子类类型 变量名 = new 子类类型();
Human h2 = m2; //父类类型 变量名=子类变量名;——向上转型
m2= (Male) h2; ——向下转型
m2.speak();
(因为h2是由m2向上转型赋值得到,所以对h2向下转型可以成功)
*Java中为了提高向下转型的安全性,引入了instanceof,如果该表达式为true,则可以安全转换
Eg. Human h4 = new Human();
if (h4 instanceof Male){ // 因为h4不是Male的实例,所以不执行if内部代码
Male m4 = (Male)h4;
m4.speak();
}