为了账号安全,请及时绑定邮箱和手机立即绑定

多态(一)

标签:
Java

前面的代理设计模式用到了多态所以就去学习巩固了下多态知识,稍微了解了之后,在写这篇笔记博客的时候突然想到一个问题,

为什么要用多态(不知道)?于是我百度查:为了让程序可以选择多个运行状态,增强软件的灵活性和扩展性。额,???喵喵喵?看了心里也清楚,但是想到如果面试官问我,我回答这个或者别的百度的,我感觉有些奇怪,可能还是没有透彻的理解多态把。

多态:同一种事物的多种形态

什么时候使用向上转型,向下转型?

答:当面对一些共性类型的时候可以采用向上转型,提高扩展性,当想要去用子类的特有方法时,会有向下转型,但向下转型存在风险

容易发生ClassCastException。只要转换类型和对象类型不匹配就会发生。

 

先来个入门的多态代码小项目把,可能都见过的小猫小狗吃东西

首先定义一个Animal类,动物能干什么,都得吃东西是吧,那就定义一个eat方法

复制代码

 1 package deep.demo1; 2  3 /** 4  * 定义一个动物类 5  * @author DeepSleeping 6  * 7  */ 8 public class Animal { 9 10     public  void eat(){11         System.out.println("动物在吃东西");12     }13 }

复制代码

然后定义一个Dog类和Cat类都继承Animal类并且都重写父类中的eat方法

复制代码

 1 package deep.demo1; 2  3 /** 4  * 定义一个小狗类,并且继承动物类 5  * @author DeepSleeping 6  * 7  */ 8 public class Dog extends Animal{ 9 10     /**11      * 重写父类中eat方法12      */13     @Override14     public void eat() {15         System.out.println("小狗在吃东西");16     }17 18 }

复制代码

复制代码

 1 package deep.demo1; 2  3 public class Cat extends Animal{ 4  5     /** 6      * 重写方法 7      */ 8     @Override 9     public void eat() {10         System.out.println("小猫在吃东西");11     }12 13     14 }

复制代码

然后创建一个Test类进行测试

复制代码

 1 package deep.demo1; 2  3 public class Test { 4  5     public static void main(String[] args) { 6          7         //实例化Dog并且调用eat方法 8         Animal dog = new Dog(); 9         dog.eat();10         11         //cat12         Animal cat = new Cat();13         cat.eat();14     }15 }

复制代码

上面的创建dog和cat的对象的动作应该就是向下转型,从而调用子类里的方法。

动物都有吃的行为,小猫小狗也是动物,所以继承了动物类,但是它们吃东西不一样啊,所以它们就分别有自己的吃东西的行为。

https://img1.sycdn.imooc.com//5b5c43630001436703660104.jpg

如果把dog中的重写方法去掉,然后再调用一次

复制代码

 1 package deep.demo1; 2  3 /** 4  * 定义一个小狗类,并且继承动物类 5  * @author DeepSleeping 6  * 7  */ 8 public class Dog extends Animal{ 9 10     /**11      * 重写父类中eat方法12      */13     /*@Override14     public void eat() {15         System.out.println("小狗在吃东西");16     }*/17 18 }

复制代码

https://img1.sycdn.imooc.com//5b5c436c0001401c03310075.jpg

 

 此时发现,就不是"小狗在吃东西了",因为小狗没有重写父类中的eat方法,所以执行的是父类中自带的eat方法(可以定义父类加abstract关键字,这样子类继承就强制实现父类中的方法了eg:public abstract void eat();)

通过上面的例子应该大概知道了多态是干什么的了。

 

但是我也有自己的疑问:

请问为什么要使用多态啊?
Animal 中eat方法,Dog继承Animal 重写自己的eat方法 
Animal dog = new Dog();
dog.eat();调用dog中的eat方法

我就非要自己创建Dog类,也写eat方法,创建cat类也写自己的eat方法,都不用写Animal了,
Dog dog = new Dog();dog.eat(); Cat cat = new Cat();不也能实现同样功能吗?

还是说多态是为了父类限制子类的行为,为了一种"规范",你继承我就必须也得能做这些事情。pencil 就不能继承Animal然后调用eat()因为这样不符合逻辑,因为铅笔不可能吃东西。所以就定义大的父类,然后子类继承实现多态,可以理解为是为了规范么?项目开发上面的人定义好父类的方法,然后让底层的人去实现子类里的方法就是了?

最近看多态总结的时候突然想起,为什么要用多态?百度查的都是那种看不懂的,什么增强软件的灵活性和拓展性,但是感觉拿不出大白话来解释就是没有真正理解

 

群里让我茅塞顿开的回答:所谓的增加灵活性和扩展性,其实很好理解,你维护一个接口肯定比维护所有的实现类方便,你一个类只要实现了一定的接口就具有接口的功能,当然很灵活


我自己之后的理解:赞同,一个真正的项目,某个父类或者接口,本来用户是有A,B,C操作,突然用户更改需求,增加D操作,只要在父类增加D方法,子类全部实现一边就可以了(eclipse报错,强制实现),同理ABCD操作,突然更改需求,不能有CD操作,就只要在父类中删除CD操作,同时子类重写的就会报错,删除即可。

我的眼见没有那么高,毕竟如果项目大了,一个父类不知道有多少个子类要继承它,如果没有多态,就得一个一个维护,有一点需求的变更,就得大动干戈,就不够灵活了。所以我也就理解了:多态可以增强软件的灵活性和拓展性。

 

原文出处:https://www.cnblogs.com/deepSleeping/p/9382580.html

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消