[Java基础]浅析Java多态

来源:互联网 发布:广州年龄人口分布数据 编辑:程序博客网 时间:2024/05/16 04:50
[Java基础]浅析Java多态

引用此文章请标明出处

http://blog.csdn.net/stacksoverflow


分享一下我对Java多态的简单理解。


多态是面向对象的一个重要概念,简单来说就是
尽可能的调用下级对象的同一方法,
尽可能不调用上级对象的同一方法。


我把调用过程分成两步:
1.找到原始类型的原始方法。
2.调用目标类型的同名方法,如果不存在,则调用原始方法。


引用此文章请标明出处
http://blog.csdn.net/stacksoverflow

下面我来详细解释:


在理解多态前,还必须理解下面几个概念。
重载,覆盖(重写)
重写与覆盖是一个概念,下文我将统一为覆盖




这样,一共有三个概念:覆盖,重载,多态


举个例子:(从上到下继承)
1.食物
2.草(继承自食物)
3.青草(继承自草)




1.动物 
    方法:吃(食物);
    方法:吃();
2.金鱼(继承自动物)
方法:吃(食物);
    方法:吃(草);
3.黑金鱼(继承自金鱼)
    方法:吃(草);
    方法:吃(青草);
    
对于如下代码
青草 qingcao = new 青草();
金鱼 jinyu = new 黑金鱼();
jinyu.吃(qingcao);


最终执行的方法为:黑金鱼.吃(草)


下面类分析执行过程:


我将等号左边的称作原始类型,等号右边的称作目标类型。
针对上面代码我们有:(只分析动物相关类)
原始类型:金鱼
目标类型:黑金鱼

引用此文章请标明出处

http://blog.csdn.net/stacksoverflow


下面我简单说下覆盖于重载:(在这里我们不讨论方法的作用域问题,假设都是public)
1.覆盖:方法名和参数类型相同的情况下,只保留子类的方法。调用子类的方法。(即子类的方法覆盖了父类的方法)
2.重载:方法名相同参数类型不同的情况下,保留所有的方法。按照参数原始类型、参数的上级原始类型依次匹配,然后调用优先匹配到的方法。


这样,对于金鱼(原始类型)和黑金鱼(目标类型)我们将其拥有的方法整理如下:
金鱼
 吃()[动物]     //继承了动物的方法
 吃(食物)[金鱼] //继承了动物的方法
 吃(草)[金鱼]


黑金鱼
 吃()[动物]        //继承了动物的方法
 吃(食物)[金鱼]    //继承了金鱼的方法
 吃(草)[黑金鱼]    //覆盖了金鱼的方法
 吃(青草)[黑金鱼]


执行过程如下:
对于
jinyu.吃(qingcao);


步骤1:找到原始类型的原始方法。
原始类型为[金鱼],所以我们在下面[金鱼]类的方法里找原始方法。
金鱼
 吃()
 吃(食物)
 吃(草)
 
没有找到参数为[青草]的方法,于是根据重载的定义,我们找[青草]的父类[草]对应的同名方法。


 吃(草)
 
得到原始方法为
金鱼.吃(草)


步骤2:调用目标类型的目标方法。
目标类型为[黑金鱼],我们在下面[黑金鱼]类的的方法里找与[吃(草)]同名的方法。
黑金鱼
 吃()
 吃(食物)
 吃(草)
 吃(青草)
 
于是找到同名的方法:
黑金鱼.吃(草)




所以,最终调用的方法为:黑金鱼.吃(草)


以上为我对多态的简单解释,如需更深入的理解多态,大家可以参考Java虚拟机的静态分派与动态分派概念。


引用此文章请标明出处
http://blog.csdn.net/stacksoverflow

0 0