多态
[TOC]
什么是多态
多态就是同类型的对象,表现出不同的形态
多态的表现形式
父类类型 对象名称 = 子类对象;
多态的前提
- 有继承关系
- 有父类引用指向子类对象 Fu f = new Zi()
- 需要有方法的重写
多态好处
使用父类类型作为参数,可以接受所有子类对象。
多态调用成员特点
- 变量调用:编译看左边,运行也看左边
- 编译看左边:javac编译代码的时候,会看左边父类中有没有这个变量,如果有,编译成功,如果没有编译失败
- 运行也看左边:java运行代码的时候,实际获取的就是左边父类中成员变量的值
- 方法调用:编译看左边,运行看右边
- 编译看左边:javac编译代码的时候,会看左边的父类有没有这个方法,如果有,编译成功,否则编译失败
- 运行看右边:java运行代码的时候,实际上运行的是子类中的方法
造成这样结果的原因是:
- 成员变量:在子类对象中,会把父类的成员变量也继承下来。父:name –> 子:name
- 成员方法:如果子类对方法进行了重写,那么在虚方法表中就会把父类的方法进行覆盖。
多态的优势以及弊端
优势
- 在多态形式下,右边对象可以实现解耦合,便于扩展和维护
- 定义方法的时候,使用父类型作为参数,可以接受所有子类对象,体现多态的扩展与便利
弊端
- 在多态模式下,不能调用子类特有的功能
这是因为在编译的时候,会先去看父类有没有这个方法,如果没有直接报错。
解决方案:变回子类类型就可以了
就比如:Dog d = (Dog) a;