Java中的virtual method
今天看jcvm的标准的 时候,看到有一个virtual method,感觉很疑惑,以前看Java的时候并没有发现有这类方法。
百度、Google了一下,才发现,Java中普通方法就是virtual method,动态绑定是Java的默认行为。
如果不想让一个方法成为virtual method,只要把这个方法申明为final就可以了。
至于在c++中虚方法是怎么回事,可以参考下面这篇文章
http://www.cnblogs.com/xd502djj/archive/2010/09/22/1832912.html
在很多的博客中也有这样一种说法,Java的virtual method其实就是dynamic binding/dynamic dispatch.
(http://stackoverflow.com/questions/9453701/what-is-virtual-method-calling-in-java)
从这里面的回答可以看出,virtual method就是为了多态而出现的。
下面简单的介绍一下动态方法调度。
在Java中,如果一个子类的方法和超类的某个方法具有相同的名称和类型签名,那么称子类中的这个方法重写了超类中相应的方法。
当子类中调用被重写的方法时,总是调用由子类定义的版本,由超类定义的版本会被隐藏。
方法重写形成了动态方法调度(dynamic method dispatch)的基础,动态方法调度可以说是Java中最强大的功能。
动态方法调度室一种机制,通过这种机制可以在运行时,而不是在编译时解析对重写方法的调用。
动态方法调度就是Java实现多态的机理所在。
首先申明一点:超类引用变量可以指向子类对象。Java利用这一事实,在运行时解析对重写方法的调用。
下面是实现原理:
当通过超类引用调用重写的方法时,Java根据在调用时所引用对象的类型来判断调用哪个版本的方法。因此,这个决定是在运行时做出的。
如果引用不同类型的对象,就会调用不同版本的方法。
也就是说,是当前正在引用的对象的类型(而不是引用变量的类型)决定了将要执行哪个版本的重写方法。
例子如下:
public class Test {
public static void main(String[] args){
superTest a = new superTest();
a.eat();
superTest b = new superTest1();
b.eat();
superTest c = new superTest2();
c.eat();
}
}
class superTest{
void eat(){
System.out.println("this is the superTest print");
}
}
class superTest1 extends superTest{
void eat(){
System.out.println("this is the superTest1 print ");
}
}
class superTest2 extends superTest{
void eat(){
System.out.println("this is the superTest2 print");
}
}
最后的输出结果是:
this is the superTest print
this is the superTest1 print
this is the superTest2 print
Java中的virtual method的更多相关文章
- java中的方法method
java中的方法必须存在于类class里,不能独立存在.类是描述具有某种特征的事物,方法则是这类 事物具有的某种功能,通过调用方法可以实现某种特定的功能.方法名一般以小写的动词开头. 例: publi ...
- Java中如何实现代理机制(JDK动态代理和cglib动态代理)
http://blog.csdn.net/skiof007/article/details/52806714 JDK动态代理:代理类和目标类实现了共同的接口,用到InvocationHandler接口 ...
- java.lang.NullPointerException: Attempt to invoke virtual method 'int com.example.xxx.Json.NewsBean.getError_code()' on a null object reference错误解决
AS在运行的过程中出现了错误: java.lang.NullPointerException: Attempt to invoke virtual method 'int com.example.xx ...
- c#和java中的方法覆盖——virtual、override、new
多态和覆盖 多态是面向对象编程中最为重要的概念之一,而覆盖又是体现多态最重要的方面.对于像c#和java这样的面向对象编程的语言来说,实现了在编译时只检查接口是否具备,而不需关心最终的实现,即最终的实 ...
- java中的方法引用(method reference)官方文档总结
2017/7/5 转载写明出处:http://www.cnblogs.com/daren-lin/p/java-method-reference.html 今天要说的是java中的一项新特性,方法引用 ...
- java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.love5/com.example.love5.Main11Activity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.
若有 java.lang.RuntimeException和 java.lang.NullPointerException: Attempt to invoke virtual method 'voi ...
- Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.app.ActionBar.setDisplayShowHomeEnabled(boolean)' on a null object reference
/********************************************************************************* * Caused by: java ...
- java.lang.NullPointerException: Attempt to invoke virtual method 'java.util.List com.yunweather.app.db.YunWeatherDB.loadProvinces()' on a null object reference
NullPointerException:查看自己的什么地方是否对空指针进行了操作 Attempt to invoke virtual method 'java.util.List com.yunwe ...
- java中什么是bridge method(桥接方法)
java中什么是bridge method(桥接方法) https://blog.csdn.net/z69183787/article/details/81115524
随机推荐
- SqlServer 事务回滚(1)
SQL事务 一.事务概念 事务是一种机制.是一种操作序列,它包含了一组数据库操作命令,这组命令要么全部执行,要么全部不执行.因此事务是一个不可分割的工作逻辑单元.在数据库系统上执行并发操作 ...
- The 2015 China Collegiate Programming Contest H. Sudoku hdu 5547
Sudoku Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)Total Subm ...
- 使用CSS/JS代码修改博客模板plus
之前对CSS/JavaScript了解还不深,只是把模板的CSS胡乱修改了几个属性.最近正好也在做一个网站的前端,学习了不少东西,再来改一改~ 上次最后之所以铩羽而归,是因为从CSS里找不到那些#和. ...
- [转]使用EasyRsa3为OpenVPN生成密码
1. 下载Easy RSA3 下载完并解压后,拷贝一份到/etc/openvpn和/home/client下 #.3版本需要独立下载个easy-rsa,该包用来制作ca证书,服务端证书,客户端证书 w ...
- HDU 2842 (递推+矩阵快速幂)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2842 题目大意:棒子上套环.第i个环能拿下的条件是:第i-1个环在棒子上,前i-2个环不在棒子上.每个 ...
- <构建之法>第十一章、十二章有感
十一章:软件设计与实现 工作时要懂得平衡进度和质量.我一直有一个困扰:像我们团队这次做 男神女神配 社区交友网,我负责主页的设计及内容模块,有个队友负责网站的注册和登录模块,有个队友负责搜索模块,有个 ...
- topcoder SRM 618 DIV2 MovingRooksDiv2
一开始Y1,Y2两个参数看不懂,再看一遍题目后才知道,vector<int>索引代表是行数,值代表的是列 此题数据量不大,直接深度搜索即可 注意这里深度搜索的访问标识不是以前的索引和元素, ...
- ACM 兰州烧饼
兰州烧饼 时间限制:1000 ms | 内存限制:65535 KB 难度:1 描述 烧饼有两面,要做好一个兰州烧饼,要两面都弄热.当然,一次只能弄一个的话,效率就太低了.有这么一个大平底锅,一 ...
- ACM: POJ 3660 Cow Contest - Floyd算法
链接 Cow Contest Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%lld & %llu Descri ...
- SPFA算法
SPFA算法 一.算法简介 SPFA(Shortest Path Faster Algorithm)算法是求单源最短路径的一种算法,它是Bellman-ford的队列优化,它是一种十分高效的最短路算法 ...