多态的理解

来源:互联网 发布:软件模块化 编辑:程序博客网 时间: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 接口实现类的对象,这里不多说。
       不知道说到这,对于多态的能不能做到理解,我这里讲的要是懂了,可以看看其他写的比我还好的博主的文章,我这里尽量用了大白话来讲讲多态到底是个什么东西,目的就是能让初学者有个多态的概念,我们说多态是一种思想,我想没有什么思想是短时间内可以领悟的,多想想吧,多看看,有好处。
       最近问我最多的问题就是,这个这个是个什么意思啊,后来我想想,怎么能让他们能有个理解呢,那就告诉他们,不这样做你会怎么样吧。
       好了,去找女朋友了。

原创粉丝点击