同一个对象可以用多种形态(子类类型、父类类型)进行表示。
多态的前提
1.要有继承、实现的关系
2.要有方法重写
3.父类/接口接收子类对象
Animal a = new Dog(); //Animal是Dog的父类
Usb u = new Mouse(); //Usb是Mouse的接口
1.成员变量的访问特点
编译看左边(父类),运行也看左边(父类)
大白话:父类有就用父类的,父类没有就报错了
2.成员本方法的访问特点
编译看左边(父类),运行也看右边(子类)
大白话:子类复写父类方法,就执行子类的方法。
一句话总结:只有复写的方法看子类,其他的都看父类,父类没有就报错。
1.好处:提高了代码的扩展性
把方法的参数写成父类、接口,调用方法时可以传递任意的子类对象。
2.弊端:不能调用子类特有的方法。如果想调用可以进行强转(向下转型)
1 1.向上转型 2 Animal a=new Dog(); //多态的写法,就是向上转型 3 4 2.向下转型 5 //判断变量a具体是什么类型 6 if(a instanceof Dog){ 7 Dog dog=(Dog)a; 8 dog.swimming(); 9 }
【注意:多态的转型并不是随意的,它是一个还原的动作。原本是什么类型,才能转换为什么类型】
3.多态转型可能会遇到的问题
ClassCastException: 多态的转型出现的问题,类型转换错了
NullPointerExeption: 一个对象或者一个数组为null,使用null去调用方法或者访问元素。