多态的理解

       这些天在啃框架,为啥突然将多态这个东西,看到周围同学似乎真的很难理解这个叫做多态的东西,我就讲讲我关于多态的一个理解。 首先什么是多态,指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式,(发送消息就是函数调用)。这段文字可以说非常不好理解了。我举个例子,拿我女朋友来说,我女朋友让我用聊天工具和她语音一下,对于语音来说,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 接口实现类的对象,这里不多说。
       不知道说到这,对于多态的能不能做到理解,我这里讲的要是懂了,可以看看其他写的比我还好的博主的文章,我这里尽量用了大白话来讲讲多态到底是个什么东西,目的就是能让初学者有个多态的概念,我们说多态是一种思想,我想没有什么思想是短时间内可以领悟的,多想想吧,多看看,有好处。
       最近问我最多的问题就是,这个这个是个什么意思啊,后来我想想,怎么能让他们能有个理解呢,那就告诉他们,不这样做你会怎么样吧。
       好了,去找女朋友了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值