Java学习--多态
1. 多态
多态:同一个对象(实物),在不同时刻体现出来的不同状态
多态的前提:
A:要有继承关系
B:要有方法重写
C:要有父类引用指向子类对象
父类 f = new 子类()
多态中的成员访问特点:
A:成员变量
编译看左边,运行看左边
B:构造方法
创建子类的时候,访问父类的构造方法,对父类的数据进行初始化
C:成员方法
编译看左边,运行看右边
D:静态方法
编译看左边,运行看右边(静态和类相关,算不上重写,所以访问还是左边的)
由于成员方法存在方法重写,所以它运行看右边
多态的好处:
- 提高了代码的维护性(继承保证)
- 提高了代码的扩展性(由多态保证)
多态的弊端:
- 不能使用子类的特有功能
把父类的引用强制装换为子类的引用(向下转型)
1.猫和狗多态练习
class Anamial{ public void eat(){ System.out.println("动物吃"); } } class Dog extends Anamial{ public void eat(){ System.out.println("狗吃骨头"); } public void lookDoor(){ System.out.println("狗看门"); } } class Cat extends Anamial{ public void eat(){ System.out.println("猫吃鱼"); } public void play(){ System.out.println("狗玩游戏"); } } class ExtendsDemo{ public static void main(String[] args){ System.out.println("Extends "); //定义动物为狗 Anamial a = new Dog(); a.eat(); //a.lookDoor(); 编译会报错,动物没有狗的方法 //将动物还原成狗 Dog d = (Dog)a; d.eat(); d.lookDoor();
//a变成猫 a = new Cat(); a.eat(); //a.play(); 编译会报错,动物没有play方法 //将动物还原为狗 Cat c = (Cat)a; c.eat(); c.play(); //Dog dd = (Dog)a; 编译不会报错,运行报错 java.lang.ClassCastException: Cat cannot be cast to Dog //不能将毛转换成狗 } }