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类,那如果里面装了无数种类型,就很难判断了,此时可以用泛型来解决,泛型后续文章再讲解

经验分享 程序员 微信小程序 职场和发展