[Java基础]浅析Java多态
来源:互联网 发布:广州年龄人口分布数据 编辑:程序博客网 时间:2024/05/16 04:50
[Java基础]浅析Java多态
引用此文章请标明出处
多态是面向对象的一个重要概念,简单来说就是
尽可能的调用下级对象的同一方法,
尽可能不调用上级对象的同一方法。
我把调用过程分成两步:
1.找到原始类型的原始方法。
2.调用目标类型的同名方法,如果不存在,则调用原始方法。
引用此文章请标明出处
http://blog.csdn.net/stacksoverflow
下面我来详细解释:
在理解多态前,还必须理解下面几个概念。
重载,覆盖(重写)
重写与覆盖是一个概念,下文我将统一为覆盖
这样,一共有三个概念:覆盖,重载,多态
举个例子:(从上到下继承)
1.食物
2.草(继承自食物)
3.青草(继承自草)
1.动物
方法:吃(食物);
方法:吃();
2.金鱼(继承自动物)
方法:吃(食物);
方法:吃(草);
3.黑金鱼(继承自金鱼)
方法:吃(草);
方法:吃(青草);
对于如下代码
青草 qingcao = new 青草();
金鱼 jinyu = new 黑金鱼();
jinyu.吃(qingcao);
最终执行的方法为:黑金鱼.吃(草)
下面类分析执行过程:
我将等号左边的称作原始类型,等号右边的称作目标类型。
针对上面代码我们有:(只分析动物相关类)
原始类型:金鱼
目标类型:黑金鱼
引用此文章请标明出处
1.覆盖:方法名和参数类型相同的情况下,只保留子类的方法。调用子类的方法。(即子类的方法覆盖了父类的方法)
2.重载:方法名相同参数类型不同的情况下,保留所有的方法。按照参数原始类型、参数的上级原始类型依次匹配,然后调用优先匹配到的方法。
这样,对于金鱼(原始类型)和黑金鱼(目标类型)我们将其拥有的方法整理如下:
金鱼
吃()[动物] //继承了动物的方法
吃(食物)[金鱼] //继承了动物的方法
吃(草)[金鱼]
黑金鱼
吃()[动物] //继承了动物的方法
吃(食物)[金鱼] //继承了金鱼的方法
吃(草)[黑金鱼] //覆盖了金鱼的方法
吃(青草)[黑金鱼]
执行过程如下:
对于
jinyu.吃(qingcao);
步骤1:找到原始类型的原始方法。
原始类型为[金鱼],所以我们在下面[金鱼]类的方法里找原始方法。
金鱼
吃()
吃(食物)
吃(草)
没有找到参数为[青草]的方法,于是根据重载的定义,我们找[青草]的父类[草]对应的同名方法。
吃(草)
得到原始方法为
金鱼.吃(草)
步骤2:调用目标类型的目标方法。
目标类型为[黑金鱼],我们在下面[黑金鱼]类的的方法里找与[吃(草)]同名的方法。
黑金鱼
吃()
吃(食物)
吃(草)
吃(青草)
于是找到同名的方法:
黑金鱼.吃(草)
所以,最终调用的方法为:黑金鱼.吃(草)
引用此文章请标明出处
http://blog.csdn.net/stacksoverflow
多态是面向对象的一个重要概念,简单来说就是
尽可能的调用下级对象的同一方法,
尽可能不调用上级对象的同一方法。
我把调用过程分成两步:
1.找到原始类型的原始方法。
2.调用目标类型的同名方法,如果不存在,则调用原始方法。
引用此文章请标明出处
http://blog.csdn.net/stacksoverflow
下面我来详细解释:
在理解多态前,还必须理解下面几个概念。
重载,覆盖(重写)
重写与覆盖是一个概念,下文我将统一为覆盖
这样,一共有三个概念:覆盖,重载,多态
举个例子:(从上到下继承)
1.食物
2.草(继承自食物)
3.青草(继承自草)
1.动物
方法:吃(食物);
方法:吃();
2.金鱼(继承自动物)
方法:吃(食物);
方法:吃(草);
3.黑金鱼(继承自金鱼)
方法:吃(草);
方法:吃(青草);
对于如下代码
青草 qingcao = new 青草();
金鱼 jinyu = new 黑金鱼();
jinyu.吃(qingcao);
最终执行的方法为:黑金鱼.吃(草)
下面类分析执行过程:
我将等号左边的称作原始类型,等号右边的称作目标类型。
针对上面代码我们有:(只分析动物相关类)
原始类型:金鱼
目标类型:黑金鱼
引用此文章请标明出处
http://blog.csdn.net/stacksoverflow
1.覆盖:方法名和参数类型相同的情况下,只保留子类的方法。调用子类的方法。(即子类的方法覆盖了父类的方法)
2.重载:方法名相同参数类型不同的情况下,保留所有的方法。按照参数原始类型、参数的上级原始类型依次匹配,然后调用优先匹配到的方法。
这样,对于金鱼(原始类型)和黑金鱼(目标类型)我们将其拥有的方法整理如下:
金鱼
吃()[动物] //继承了动物的方法
吃(食物)[金鱼] //继承了动物的方法
吃(草)[金鱼]
黑金鱼
吃()[动物] //继承了动物的方法
吃(食物)[金鱼] //继承了金鱼的方法
吃(草)[黑金鱼] //覆盖了金鱼的方法
吃(青草)[黑金鱼]
执行过程如下:
对于
jinyu.吃(qingcao);
步骤1:找到原始类型的原始方法。
原始类型为[金鱼],所以我们在下面[金鱼]类的方法里找原始方法。
金鱼
吃()
吃(食物)
吃(草)
没有找到参数为[青草]的方法,于是根据重载的定义,我们找[青草]的父类[草]对应的同名方法。
吃(草)
得到原始方法为
金鱼.吃(草)
步骤2:调用目标类型的目标方法。
目标类型为[黑金鱼],我们在下面[黑金鱼]类的的方法里找与[吃(草)]同名的方法。
黑金鱼
吃()
吃(食物)
吃(草)
吃(青草)
于是找到同名的方法:
黑金鱼.吃(草)
所以,最终调用的方法为:黑金鱼.吃(草)
以上为我对多态的简单解释,如需更深入的理解多态,大家可以参考Java虚拟机的静态分派与动态分派概念。
引用此文章请标明出处
http://blog.csdn.net/stacksoverflow
0 0
- [Java基础]浅析Java多态
- 【java基础】浅析String
- java基础---面向对象浅析
- Java基础-ArrayList源码浅析
- Java基础-LinkedList源码浅析
- java基础-反射技术浅析
- Java 内存分配全面浅析 | Java基础
- java基础(21)--java.io.Serializable浅析
- Java基础:浅析Java中的final关键字
- Java基础小技巧回顾--浅析String
- java基础(15)-- 浅析I/O模型
- JAVA基础(003_Iterator浅析)
- 浅析Java多线程程序设计机制-Java基础-Java-编程开发
- java 浅析
- Java基础:浅析Java抽象类和接口的比较
- java基础--浅析java中序列化机制
- java基础(四)之java浅析异常处理机制
- Java基础:浅析Java中的访问权限控制
- 获取android手机信息,网络ip,序列号等
- SQL笔记(10)_第十章 数据排序与分组
- 包体可压缩80%!爱加密手游压缩和云更新简直颠覆!
- string
- boost::asio译文
- [Java基础]浅析Java多态
- ARM+llinux系统移植3G拨号上网收发短信(一)
- MaterialDialog和FloatingActionButton的基本使用方法
- axis2开发WebService 碰到的错误
- 使用jquery 和 css 实现互斥按钮状态切换
- LeetCode--H-Index
- [super viewDidLoad]
- JMeter压力测试入门教程[图文]
- 去掉xml中每对标签之外的换行符、空格、tab键