多态的前提与体现
- 有继承关系。继承让类与类产生了关系,是多态的前提。
- 要有方法重写。多态就是靠方法的重写来体现不同的状态的,如果没有重写也是可以的,但是这样的多态就没有意义,没有表现出多种状态。
- 要有父类引用指向子类对象。
父 f = new 子();
多态中的成员访问特点:
- 成员变量
编译看左边,运行看左边。
- 构造方法
创建子类对象的时候,访问父类的构造方法,对父类的数据进行初始化。
- 成员方法
编译看左边,运行看右边。
即多态中,不存在成员变量的重写,用的始终是父类的成员变量,但是成员方法存在重写,子类会覆盖掉父类的。
- 静态方法
编译看左边,运行看左边。(静态和类相关,算不上重写,所以访问的还是左边的,即父类的。)
多态的好处:
- 提高了代码的可维护性(继承保证)
- 提高了代码的可扩展性
多态的弊端:
只能使用父类中定义过的功能,不能使用子类的特有功能。
如何解决呢?
- 创建子类对象调用该子类的方法。(可以,但是不合理,而且太占内存)
- 把父类的引用强制转换为子类的引用。(向下转型)
对象间的转型问题:
- 向上转型
Fu f =new Zi();//子类转换为父类
- 向下转型
Zi z =(Zi) f;//要求父类f必须是能够转换为子类的,即该f是事先经过向上转型过的
编程中,如果出现ClassCastException报错,多出现在多态的向下转型中相互转型的两个类不匹配造成的。