多态:同一个对象,在不同时刻表现出来的不同形态
多态的前提和体现
1>.有继承/实现关系
2>有方法重写,重写父类中的方法
有父类引用指向子类对象 即 Animal animal=new cat();
1.多态中成员方法的访问特点:
1>假设cat里有变量:age weight
Ainmal里有:age
成员变量:编译看左边,运行也看左边 就是Animal animal=new cat(animal.weight); 是不对的因为Animal里没有weight 因为编译看左边
对于成员变量:编译运行都看左边。也就是成员变量没有多态特性。
编译看左边就是看左边的Animal类里是否有weight
2>子类里面:时
父类里面:public int age=40;
但是最后向上转型后animal.age是输出40,因为成员变量编译和执行都看左边
成员方法:编译看左边,执行看右边
静态方法看左边;
非静态方法:编译看左边,运行看右边。
执行看右边就是看右边的Cat里有没有这个方法
为什么成员变量和成员方法的访问不一样呢?
因为成员方法有重写,而成员变量没有
2.多态的好处和弊端
多态的好处:提高了程序的可扩展性
具体体现:定义方法的时候,使用父类型作为参数,将来在使用的时候,使用具体的子类型参与操作
程序举例:
这样每出现一个新动物都需要在动物操作类里新增加一个userAnimal,使用多态可简化代码
多态:
这样以后增加新动物的时候就不需要在操作类里增加新的方法,直接在测试类里调用即可
多态的弊端:不能使用子类的特有功能
lookDoor是Dog特有的功能
Animal类型的对象不能调用子类特有的功能
3.多态的转型
多态的向下转型解决了不能使用子类特有方法的弊端