博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java基础:多态过程中的动态绑定
阅读量:5020 次
发布时间:2019-06-12

本文共 928 字,大约阅读时间需要 3 分钟。

重刷java-core的chapter05,P158

重读多态,感觉又不一样了。

记录一下对象方法执行过程:

1.  编译器查看对象声明类型和方法名,如class.fuction(param),class声明为A对象,则列出所有A的function(param)和父类中的public的function(param)。

Employee {... getSalary(){}}Manager extends Employee{... getSalary(){}} Manager managerA Employee e =managerA e.getSalary(){}

  这里会列出 e 的getSalary,e的父类的public的getSalary,e的所有子类的getSalary。

 

2. 重载解析overloading resolution :查看调用方法时提供的参数类型。如查看param是int还是String,由于允许类型转换,如int转换成double,son可以转换成father等等,发现多个或者没有匹配的参数,会报错。

3.如果时private/static/final方法,或者构造器,那么编译器可以准确的知道应该调用哪个方法,这种调用方式成为静态绑定static binding。于此对应的是,调用的方法依赖于隐式参数的实际类型,并且在运行时实现动态绑定,生成调用fuction(param)的指令。

4.当程序运行,并且采用动态绑定调用方法时,虚拟机一定调用与class所引用对象的实际类型最合适的那个类的方法。假设class的实际类型时son,它是father的子类。如果son定义了fuction(param),就直接调用;否则,调用father的public function(param),以此类推。

   1的例子中,e的实际类型是Employee的子类对象Manager,所以调用Manager的getSalary().

 

由于调用方法用搜索,很花时间。虚拟机会先为每个类创建一个方法表,到时候直接从表里面找。

 

转载于:https://www.cnblogs.com/zhizhiyin/p/11095703.html

你可能感兴趣的文章
AJAX
查看>>
python字典
查看>>
python 中如何判断list中是否包含某个元素
查看>>
xml 模块
查看>>
14.7.1 重新调整InnoDB系统表空间的大小
查看>>
存储过程
查看>>
Fiddler4抓包工具使用教程一
查看>>
记一次注解处理器的开发过程
查看>>
初学 Python 者自学 Anaconda 的正确姿势是什么?
查看>>
在Linux或者Unix下打开,每一行都会出多出^M这样的字符
查看>>
[APIO2010]特别行动队
查看>>
[SCOI2016]幸运数字
查看>>
SpringBoot 集成ehcache
查看>>
初步swift语言学习笔记2(可选类型?和隐式可选类型!)
查看>>
Nginx + Tomcat 反向代理 如何在高效的在一台服务器部署多个站点
查看>>
在Vs2012 中使用SQL Server 2012 Express LocalDB打开Sqlserver2012数据库
查看>>
在Macos下完美解决Adobe Dreamweaver CC 2018 汉化及操作方法
查看>>
【转】 Newtonsoft.Json高级用法
查看>>
CodeBlocks X64 SVN 编译版
查看>>
Excel催化剂开源第42波-与金融大数据TuShare对接实现零门槛零代码获取数据
查看>>