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多态 运行时多态和编译时多态相关推荐

  1. Java高版本编译低版本运行_Java高版本编译低版本运行错误(ConcurrentHashMap.keySet)...

    发布于: 2018-06-19 11:13:37 问题 有个程序,在有些机器会出现清空数据失败的问题,不抛出任何错误,本机无法重现. 定位问题 由于不抛出任何错误,只能增加日志, 最终定位到调用Con ...

  2. Java第四次作业——面向对象高级特性(继承和多态)

    Java第四次作业--面向对象高级特性(继承和多态) (一)学习总结 1.学习使用思维导图对Java面向对象编程的知识点(封装.继承和多态)进行总结. 2.阅读下面程序,分析是否能编译通过?如果不能, ...

  3. Java提高篇 —— Java三大特性之多态

    一.前言 面向对象编程有三大特性:封装.继承.多态. 封装:隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据.对外界而已它的内部细节是隐藏的,暴露给外界的只是它的访问 ...

  4. [转载] c++多态与java多态性_Java中的多态性

    参考链接: Java中的加法和串联 c++多态与java多态性 Polymorphism is one of the core concepts of OOPS paradigm. The meani ...

  5. C 多态和java多态_C与java的多态机制与区别

    既然多态是面向对象的三大本质特征之一(其它两个是数据抽象和继承),那么 C++为什么不将方法调用的默认方式设置为动态绑定,而要通过关键字virtual进行标记呢?Bruce Eckel在<Thi ...

  6. java中的多态性_[转载] c++多态与java多态性_Java中的多态性

    参考链接: Java中的加法和串联 c++多态与java多态性 Polymorphism is one of the core concepts of OOPS paradigm. The meani ...

  7. c++多态与java多态性_Java中的多态性

    c++多态与java多态性 Polymorphism is one of the core concepts of OOPS paradigm. The meaning of polymorphism ...

  8. java 和c 多态比较_多态在 Java 和 C 编程语言中的实现比较

    2011 年 12 月 22 日发布 众所周知,多态是面向对象编程语言的重要特性,它允许基类的指针或引用指向派生类的对象,而在具体访问时实现方法的动态绑定.C++ 和 Java 作为当前最为流行的两种 ...

  9. java多态app_【Java基础】Java中的多态

    什么是多态 多态是一个对象的多种实现,是建立在继承的基础上的,即对象"人",有老师和学生不同的实现,其实总结起来就是允许将子类类型的指针赋值给父类类型的指针. 多态的发生条件 多态 ...

  10. 【Java基础】Java的继承和多态

    文章目录 一.java类的封装 二.java简单的继承及单继承和多继承的区别 1.简单继承 2.单继承 三.java的多态 1.多态的好处 2.多态的弊端 四.java的抽象类 五.java的接口 1 ...

最新文章

  1. Gantt Chart in JavaScript (HTML5) | FusionCharts
  2. 关于ccflow的编译错误
  3. 关于《红楼梦》的读后感优秀范文2000字
  4. shell脚本练习(12.8)
  5. 逻辑漏洞——权限控制问题
  6. linux环境部署常用命令
  7. 论文浅尝 | 通过知识到文本的转换进行知识增强的常识问答
  8. 包装类型与基本类型的装箱与拆箱操作
  9. gatsby_如何使用Gatsby和React Leaflet创建自己的圣诞老人追踪器
  10. 全栈工程师对Python面试中is和==的区别做出解释!看完真的学到了
  11. storm 可靠性和非可靠性
  12. 如何简单描述java中的代理模式
  13. 更换app图标和名称
  14. Android:如何打开工程模式
  15. 蔚来、小鹏、理想自动驾驶能力的纵向演进与横向比较
  16. mysql启动失败 查看日志文件_mysql诊断启动问题、查看日志文件详解
  17. 《物流配送中VRP问题的多目标优化方法研究》个人小结
  18. Tesseract识别特殊符号Ø
  19. AUR 打包自己的软件
  20. linux tcp限流脚本,TCP通过滑动窗口和拥塞窗口实现限流,能抵御ddos攻击吗

热门文章

  1. SQL-查找最晚入职的员工的所有信息
  2. 云管平台中租户以及多租户概念简单说明
  3. 测试用例八大要素有哪些?
  4. 黑盒测试用例设计-等价类划分法
  5. Qt之读取qss文件
  6. 倒计时7天!解锁“2022阿里巴巴开源开放周”精彩议程
  7. 愧对我的blog,真是惭愧
  8. 炫酷HTML5网页背景动画
  9. 上海市计算机等级考试一级试题,上海计算机一级考试试题及答案
  10. emoji表情上传服务器的问题