java基础---多态的好处和缺点
1.总结:
好处:
(1)简化了代码 (2)提高了代码的维护性 (3)提高了代码的扩展性
缺点:
利用多态无法访问子类所特有的方法
缺点解决办法:
向下转型+instanceof关键字
向上转型和向下转型的概念
向上转型:
转型又分为向上转型和向下转型,向上转型类似于之前学基本数据类型时学过的自动类型转换,格式: <父类型><引用变量名>=new <子类型>(); 例如:
Father fa=new Son()
特点:
(1)子类转为父类,父类的引用指向子类对象,类似于自动进行类型转换 (2)此时通过父类引用变量调用的方法是子类覆盖或继承父类的方法(多态的好处) (3)此时通过父类引用变量无法调用子类特有的属性和方法(多态的缺点)
向下转型(类似于强制类型转换)
格式:<子类型><引用变量名>=<(子类型)><父类型的引用变量>;
Father fa=new Father(); Son s=(Son)fa
特点:
1.父类转为子类,父类引用转为子类对象,.类似于强制类型转换,不过在向下转型过程中,如果没有转换为真实子类类型,会出现类型转换异常 ClassCastException
ClassCastException 异常名称:类型转换异常 产生原因:在向下转型的时候没有转换成真实的子类类型 解决办法:在向下转型之前**,对父类引用作判断,**判断父类引用到底是哪一种子类,判断成功后再强转,利用Instanceof关键字来做判断
Father fa=new Son();
if(fa instanceof Son){
Son son=(Son)fa
}
instanceof关键字 作用:判断左边对象是否属于右边类的实例 格式:对象 instanceof 类 返回值是boolean类
后话: 虽然多态的缺点得以解决,但是还是不够完美,体现在以下两点 (1)假设这时又来new了一个多态,Father fa2=new Son2();那还需要继续添加else if判断,违背了开闭原则 (2)假如第一点我们不在乎,那这第二点就不得不在乎了,假如我们的父类不是father这个类,而是Object,那怎么办?Object有无数的子类,我们要一个一个的去判断吗?可想而知是判断不完的,例如后面会学的集合,集合里可以装任意类型的数据,但是都是Object类型,假设里面装了string类的数据S,那如果我们想调用String类特有的方法,就只能做判断了,判断一下S是不是属于String类,那如果里面装了无数种类型,就很难判断了,此时可以用泛型来解决,泛型后续文章再讲解
