多态 多态的概念:对象在不同时刻表现出来的不同状态 理解:针对引用类型的,在编译期间和运行期间的类型不一致,就是多态。 创建对象,编译的时候只看左边,运行的时候才会new右边对象。 多态的前提: 1、要有继承关系(或实现关系) 2、要有方法重写 3、要有父类引用(或父接口)指向子类对象 多态有三种体现形式:类多态、抽象类多态、接口多态 多态中的成员特点:【重点】(方法有重写,而变量没有) 1、成员变量 编译看左边,运行看左边 2、成员方法 编译看左边,运行看右边(没被重写的方法,结果还是父类的) 注意:编译期间是要看父类的,如果子类有的方法父类没有,同样会报错。 多态的弊端和解决方案: 多态的弊端:父类的引用不能使用子类的特有功能。 解决方案:向下转型 (多态的定义是向上转型) 自我理解:定义的父类变量中装的是子类的对象,想让父类变量能够访问子类对象特有的成员变量和成员方式时(除继承的父类变量和方法外的),需要将父类变量向下转型为子类变量才行。 比如:Fu f = new Zi(); Zi z = (Zi)f; 多态转型中出现的问题: 父类的变量中装的是类a的对象,结果要转换为类b的变量,肯定会报错的啦,报错为:java.lang.classcastexception(编译时不报错,运行时报错) 比如:Animal a = new Cat(); Dog d = (Dog)a; 会报错 多态的好处: 为了提高代码的扩展性和可维护性 引申: 继承的好处是提高代码的复用性;坏处是父类改动,子类全部改动,即强耦合性。 封装的好处是不能随意访问成员变量;坏处是访问操作略有复杂 |