多态的理解
来源:互联网 发布:软件模块化 编辑:程序博客网 时间:2024/05/29 03:39
这些天在啃框架,为啥突然将多态这个东西,看到周围同学似乎真的很难理解这个叫做多态的东西,我就讲讲我关于多态的一个理解。 首先什么是多态,指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式,(发送消息就是函数调用)。这段文字可以说非常不好理解了。我举个例子,拿我女朋友来说,我女朋友让我用聊天工具和她语音一下,对于语音来说,QQ实现了语音功能,微信也有语音的功能,所以说我要回复我女朋友,我可以用QQ语音,也可以用微信语音,这就是根据不同的对象,选择不同的行为方式。
先上代码,后面我们在来讲讲。
/** * 这是一个父类,里面有一个call的方法,用来给我回复。 * @author lenovo * */public class Call { public void call(){ System.out.println("这是一个call方法"); }}
下面分别是qq和微信继承这个类,从而实现call的方法。
/** * QQcall 这个类继承了Call * @author wst * */public class QQcall extends Call{ public void call(){ System.out.println("我用qq回复"); }}
/** * 微信继承call * @author wst * */public class WeChatCall extends Call{ public void call(){ System.out.println("我用微信回复"); }}
下面是测试类
/** * 这是主要的测试类 * @author wst * * */public class TestCall { public static void main(String[] args) { Call call1=new QQcall(); call1.call(); Call call2=new WeChatCall(); call2.call(); }}
初学者对于Call call1=new QQcall()和Call call2=new WeChatCall()这样的语句不是很理解,这里有个概念叫做向上转型。从某种程度来来说,子类继承了父类,子类可以对父类的一些方法进行重写,进行扩展,但还是继承自父类。如果说父类是人,子类继承了人,我们可以说是女人,所以这里的Call call1=new QQcall()和Call call2=new WeChatCall()叫做父类指向子类的对象。我们可以用call来指代 qqcall,wechatCall,但是反过来就不对了。
所以上面代码总结起来多态实现的条件:要有继承,或实现要有重写,父类引用指向子类对象。(又是这种概念,我相信理解了之后看都不看这些概念)。
有人要问了,那你上面的代码为什么不用QQ call1=new QQcall()和WechatCall()这样去创建对象呢,为什么一定要用父类?这个问题把我也问蒙住了,我想了一下,刚刚的代码似乎体现不出来,我们接着刚刚女朋友的例子往下说,说我这个女朋友让我call她,但是一会要微信,一会要qq,我这个时候就要来个判断了,代码如下:
/** * 这是主要的测试类 * @author wst * * */public class TestCall { public static void main(String[] args) { QQcall call1=new QQcall(); WeChatCall call2=new WeChatCall(); String str = null;//这句话就是为了if里面做个判断 给个逻辑 if(str.equals("用qq")){ call1.call(); } if(str.equals("用wechat")){ call2.call(); } }}
那万一我女朋友要我用十几种方法要我回复她,我是不是也要做十几个判断呢,那这个代码实在是太长了,所以我们可以这样写
public class TestCall { public static void doCall(Call call){ call.call(); } public static void main(String[] args) { doCall(call); //这里的参数可以根据传进来的参数 比武穿来一个qqcall,传来一个WeChatcall, //这时候就相当于Call call=new QQcall(); }}
说到这里不知道还有没有理解这里的父类引用指向子类。这种写法很常见,集合里面 :
List<String> list=new ArrayList<String>();List<String> list=new LinkedList<String>();
还有种多态实现的方式就是用接口,这个也是我经常使用的,和继承一下实例化对象就想下面一样:
接口 变量 = new 接口实现类的对象,这里不多说。
不知道说到这,对于多态的能不能做到理解,我这里讲的要是懂了,可以看看其他写的比我还好的博主的文章,我这里尽量用了大白话来讲讲多态到底是个什么东西,目的就是能让初学者有个多态的概念,我们说多态是一种思想,我想没有什么思想是短时间内可以领悟的,多想想吧,多看看,有好处。
最近问我最多的问题就是,这个这个是个什么意思啊,后来我想想,怎么能让他们能有个理解呢,那就告诉他们,不这样做你会怎么样吧。
好了,去找女朋友了。
- 多态的理解
- 多态的理解
- 多态的理解
- 多态的理解
- 多态的理解
- 多态的理解
- 多态的理解
- 多态的理解
- 多态的理解
- 多态的理解
- 多态的理解
- 多态的理解
- 多态的理解
- 多态的理解
- 多态的理解
- 多态的理解
- 多态的理解
- 多态的理解
- UE4之蓝图接口
- 关于单向链表创建以及一些简单的增删查改功能
- C++函数概述
- 30多条mysql数据库优化方法,千万级数据库记录查询轻松解决
- javascrip 计算器代码
- 多态的理解
- CSU-ACM2017暑假集训比赛2 B
- 8月2日小结
- [LeetCode] 382. Linked List Random Node
- varnish学习笔记
- POJ-2367 Genealogical tree(拓扑排序)
- BZOJ2435 守卫者的挑战
- 2017暑假集训第一轮考试小结
- RequireJs的使用