java基础:多态过程中的动态绑定
重刷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().
由于调用方法用搜索,很花时间。虚拟机会先为每个类创建一个方法表,到时候直接从表里面找。
java基础:多态过程中的动态绑定的更多相关文章
- Java实例化对象过程中的内存分配
Java实例化对象过程中的内存分配: https://blog.csdn.net/qq_36934826/article/details/82685791 问题引入这里先定义一个很不标准的“书”类,这 ...
- 在java的多态调用中,new的是哪一个类就是调用的哪个类的方法。
在java的多态调用中,new的是哪一个类就是调用的哪个类的方法.(x) 原因: ava多态有两种情况:重载和覆写 在覆写中,运用的是动态单分配,是根据new的类型确定对象,从而确定调用的方法: 在重 ...
- 四、java基础-面向过程_对象_类中可出现的因素
1.面向过程和面向对象区别: 1)面向过程:开发一个应用程序.一个项目,必须先了解整个过程,了解各个步骤.模块间的因果关系,使的面向过程方式去开发程序时,代码和代码之间的关联程度是非常强.所以其中任何 ...
- 超详细Java基础-多态
茫茫人海千千万万,感谢这一秒你看到这里.希望我的能对你的有所帮助!共勉! 愿你在未来的日子,保持热爱,奔赴山海! Java基础知识(多态) 多态 多态就是指程序中定义的引用变量所指向的具体类型和通过该 ...
- Java 程序运行过程中的内存分析
作为 java 程序员,都应该知道 Java 程序运行在 JVM(Java Virtual Machine,Java 虚拟机)上,可以把 JVM 理解成 Java 程序和操作系统之间的桥梁,JVM 实 ...
- JAVA基础篇NO2--Java中的基本命名规则及数据类型
1.Java中的常量及进制 1.常量: 在程序运行的过程中,不可以改变的量,就是常量 boolean类型的值只能是true或者false null: 空常量, 代表不存在! ------------- ...
- 解决 java 使用ssl过程中出现"PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target"
今天,封装HttpClient使用ssl时报一下错误: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorExc ...
- Java基础__Integer类型中的自动装箱
Integer类型的自动装箱:就是Java自动将原始类型值转换成对应的对象,比如将int的变量转换成Integer对象,这个过程叫做装箱,反之将Integer对象转换成int类型值,这个过程叫做拆箱. ...
- Java基础之String中equals,声明方式,等大总结
无论你是一个编程新手还是老手,提到String你肯定感觉特别熟悉,因为String类我们在学习java基础的时候就已经学过,但是String类型有我们想象的那么简单吗?其实不然,String类型的知识 ...
随机推荐
- 基本 Java Bean
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave ...
- web前端三大主流框架的对比
MVX框架模式:MVC+MVP+MVVM 1.MVC:Model(模型)+View(视图)+controller(控制器),主要是基于分层的目的,让彼此的职责分开. View通过Controller来 ...
- amazeUI modal 模态框 关闭属性
$('#my-prompt').modal({ relatedTarget: this, closeViaDimmer: false, // 点击外部空白处不关闭弹窗 closeOnConfirm:f ...
- Python: 对于DataFrame.loc传入列表和传入元组输出区别的理解
def test(): import pandas as pd tuples = [ ('cobra', 'mark i'), ('cobra', 'mark ii'), ('sidewinder', ...
- hdoj2594(kmp算法next数组的应用)
题目链接:https://vjudge.net/problem/HDU-2594 题意:给定两个字符串s1.s2,求s1的前缀和s2的后缀的最长公共部分. 思路: 将s1和s2连接后求nex数组即可, ...
- Sql 第一行某列减第二行某列
--1. 将结果插入临时表SELECT *INTO xxx FROM( SELECT TOP 1 a.FQTY,a.fseq FROM T_SAL_ORDERENTRY as a WHERE FQTY ...
- VS2010 安装boost库
1.下载boost库 boost官网:www.boost.org,目前最新的版本是1.64,直接下载地址:https://dl.bintray.com/boostorg/release/1.64.0/ ...
- python3 字符集的应用
python3的字符集测试 s_test=u"严" print(s_test.encode('gbk')) print([s_test]) #print(s_test[]) #pr ...
- dubbo中使用的zookeeper,netty以及javassist的Demo文件
javassist测试Demo netty测试Demo zookeeper测试Demo
- 【转载】在使用JDBC连接MySql时报错:You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support
在使用JDBC连接MySql时报错:You must configure either the server or JDBC driver (via the serverTimezone config ...