多态的表现形式:
父类类型 对象名称=子类对象;
多态的前提:
1.有继承关系
2.有父类应用指向子类对象
3.有方法重写
我们来看一个多态的使用案例
多态调用成员的特点:
变量调用:编译看左边,调用看左边
方法调用:编译看左边,调用看右边
来看以下的案例:
public static void main(String[] args) { animal d=new dog(); System.out.println( d.name); } class animal{ String name ="动物"; public void show(){ System.out.println("Animal-show"); } } class dog extends animal{ String name ="dog"; int age=18; @Override public void show() { System.out.println("dog-show"); } }
当把父类animal中的String name ="动物";删掉后,会报错,因为编译看左边,父类中没有变量name。运行的时候也看左边,输出的结果是”动物“
当调用show方法时,输出结果是dog-show,调用的是子类的方法。因为虚方法表中子类方法将父类进行覆盖,这也就是说的运行看右边。
看以上代码,打印的结果是“动物”,因为变量类型是父类,所以会到父类的存储空间调用name。
简单来说,多态相当于就是父类类型,多态指的是成员方法的多态,因为调用方法时对象找到的虚方法表中的方法被覆盖了。
多态的优势和弊端
优势:
1.再多态形式下,右边对象可以实现解耦合,便于扩展和维护
2.定义方法时,使用父类型作为参数,可以接收所有子类对象。
弊端:
1.不能调用子类的特有功能,编译时会看父类中有没有这个方法,如果没有直接报错
解决方法:将类型变回子类类型
细节:
转成其他类型的会报错
可以用 (对象 insranceof 类名)判断对象原本属于要判断的类。相同值为ture,不同值为false.