java多态编译,java多态 运行时多态和编译时多态
java多态 运行时多态和编译时多态
我们知道java的多态是一个重要的特性,其中体现java的多态有两种形式。运行时的多态和编译时的多态。
编译时的多态会发生在方法重载的时候,方法的重载指方法名相同,方法的参数列表不同,这样在类加载的
时候就会加载两个方法的版本。这个过程是在编译期就是确定的,这时候我们通过不同参数调用相同函数名的
时候就会有不同的结果,这是编译时的多态,需要注意的加载函数版本不同是根据参数列表确定的,而不是根据方
法返回值类型确定的,也就是说方法参数列表不同才会有重载。调用不同版本函数的时候才会有不同的结果
运行时的多态发生在继承的时候,父类有个方法,子类重写(覆盖)了父类的方法。父类有一个函数,子类定义了一个
和父类相同的函数,包括参数列表相同。这时候由父类对象指向子类的实例的时候,就会调用子类的方法。这是运行
时多态的典型例子。下面我们也会给出具体的代码来让我们更深入的了解继承之后的运行时多态。
package MM;
public class TestPolymorphic {
static class A {
public void print(A a) {
System.out.println("A and a");
}
public void print(D d) {
System.out.println("A and D");
}
}
static class B extends A{
public void print(A a) {
System.out.println("B and A");
}
public void print(B b) {
System.out.println("B and b");
}
}
static class C extends B{
}
static class D extends B{
}
public static void main(String[] args) {
A a1=new A();
A a2=new B();
B b=new B();
C c=new C();
D d=new D();
a1.print(b);
a1.print(c);
a1.print(d);
a2.print(b);
a2.print(c);
a2.print(d);
b.print(b);
b.print(c);
b.print(d);
}
}
我们来分析下上面的结果。根据对象的不同我们分成三份来分析
首先声明的A的对象 A a1=new A();这时候传入对象的时候,如果该方法的参数是对应的类
的对象则会执行对应的方法,如果没有,就会用父类对象来代替子类对象进入方法。因为父类对象即子类对象。
所以输出的结果会出现最上面的三条。
然后声明了父类的变量指向了子类对象,A a2=new B();这时候体现了多态性,首先执行a2.print(b);这时候子类
是存在参数是b的类print函数,但是父类中不存在,所以会用父类对象代替子类对象传入参数,调用父类中的
public void print(A a)这时候发现子类中重写了这个方法,所以会调用子类的public void print(A a)方法。所以
会输出第四条语句。第五条也同理输出B and A。第六条中父类有参数为D类对象的print方法,所以会输出A and D
最后声明了子类变量指向子类对象的实例,B b=new B();这时候调用子类的函数的如果子类有对应的函数则会直接
如果子类没有对应的函数,而父类有,会调用父类的函数,如果子类和父类都没有,会把参数的父类对象传给调用的
函数,然后再按照子类父类的顺序查看是否有对应的函数。
需要注意的是:多态性体现在父类的变量指向子类变量。当我们用父类变量指向子类变量的时候,这个父类变量没
办法调用子类中写了的而父类中没写的方法。这也是后两种对象的调用函数的区别。
java多态编译,java多态 运行时多态和编译时多态相关推荐
- Java高版本编译低版本运行_Java高版本编译低版本运行错误(ConcurrentHashMap.keySet)...
发布于: 2018-06-19 11:13:37 问题 有个程序,在有些机器会出现清空数据失败的问题,不抛出任何错误,本机无法重现. 定位问题 由于不抛出任何错误,只能增加日志, 最终定位到调用Con ...
- Java第四次作业——面向对象高级特性(继承和多态)
Java第四次作业--面向对象高级特性(继承和多态) (一)学习总结 1.学习使用思维导图对Java面向对象编程的知识点(封装.继承和多态)进行总结. 2.阅读下面程序,分析是否能编译通过?如果不能, ...
- Java提高篇 —— Java三大特性之多态
一.前言 面向对象编程有三大特性:封装.继承.多态. 封装:隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据.对外界而已它的内部细节是隐藏的,暴露给外界的只是它的访问 ...
- [转载] c++多态与java多态性_Java中的多态性
参考链接: Java中的加法和串联 c++多态与java多态性 Polymorphism is one of the core concepts of OOPS paradigm. The meani ...
- C 多态和java多态_C与java的多态机制与区别
既然多态是面向对象的三大本质特征之一(其它两个是数据抽象和继承),那么 C++为什么不将方法调用的默认方式设置为动态绑定,而要通过关键字virtual进行标记呢?Bruce Eckel在<Thi ...
- java中的多态性_[转载] c++多态与java多态性_Java中的多态性
参考链接: Java中的加法和串联 c++多态与java多态性 Polymorphism is one of the core concepts of OOPS paradigm. The meani ...
- c++多态与java多态性_Java中的多态性
c++多态与java多态性 Polymorphism is one of the core concepts of OOPS paradigm. The meaning of polymorphism ...
- java 和c 多态比较_多态在 Java 和 C 编程语言中的实现比较
2011 年 12 月 22 日发布 众所周知,多态是面向对象编程语言的重要特性,它允许基类的指针或引用指向派生类的对象,而在具体访问时实现方法的动态绑定.C++ 和 Java 作为当前最为流行的两种 ...
- java多态app_【Java基础】Java中的多态
什么是多态 多态是一个对象的多种实现,是建立在继承的基础上的,即对象"人",有老师和学生不同的实现,其实总结起来就是允许将子类类型的指针赋值给父类类型的指针. 多态的发生条件 多态 ...
- 【Java基础】Java的继承和多态
文章目录 一.java类的封装 二.java简单的继承及单继承和多继承的区别 1.简单继承 2.单继承 三.java的多态 1.多态的好处 2.多态的弊端 四.java的抽象类 五.java的接口 1 ...
最新文章
- php 二维数组排序函数,php自定义二维数组排序函数array
- ES6常用新特性---笔记一
- 【Flutter】Dart 函数 ( 函数构成 | 私有函数 | 匿名函数 | 函数总结 )
- 设置自增递增零开始_MySQL中如何设置自动递增id主键重新计数从1开始?
- 神策数据上线“点击分析”,深度感知用户点击行为
- docker desktop一直starting不变化
- PHP伪造来源HTTP,伪造来源采集http.php
- Jupyter notebook绘制热力图边缘只有一半的问题
- 中秋祝福网页_中秋客户维系关怀,该送客户什么礼品?
- 阿里云视频云 Retina 多媒体 AI 体验馆开张啦
- 人工智障学习笔记——机器学习(7)FM/FFM
- 如何迁移mac电脑上的itunes备份iphone的文件
- 每天五分钟linux(14)-head
- 根据中心点、半径长度和角度画点
- 【BZOJ3191】【JLOI2013】卡牌游戏 [DP]
- tomcat 日志配置
- 分享几款常用的MySQL管理工具
- LoadRunner测试139邮箱的脚本
- 传智播客黑马程序员_Hanselminutes播客48-适用于极客和程序员的入门棋盘游戏
- 编译LibreELEC.tv,报错: ld -lz can not find -lz,原来是zlib-1.2.11没有交叉编译
热门文章
- 学会C语言,这些小游戏你也可以写出来
- 基于ijkplayer 0.8.8编译的完整so. libijkffmpeg.so等,支持ssl h265, rm, rmvb
- w8计算机内存不足怎么办,win8计算机内存不足怎么办解决方法汇总
- Loadrunner进行手机APP压力测试(亲测可行)
- 新手没有灵感也可以写好短文案的六个方法,第六个最实用
- 敏感性分析(Sensitivity Analysis) 和龙卷风图(tornado diagram)
- 《C语言程序设计》模拟试题
- Java实现五子棋小游戏(附思路讲解,全部代码,游戏截图)
- 专访12306技术负责人朱建生:能否向淘宝取经
- JS的类型转换,强制转换和隐式转换