今天看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的更多相关文章

  1. java中的方法method

    java中的方法必须存在于类class里,不能独立存在.类是描述具有某种特征的事物,方法则是这类 事物具有的某种功能,通过调用方法可以实现某种特定的功能.方法名一般以小写的动词开头. 例: publi ...

  2. Java中如何实现代理机制(JDK动态代理和cglib动态代理)

    http://blog.csdn.net/skiof007/article/details/52806714 JDK动态代理:代理类和目标类实现了共同的接口,用到InvocationHandler接口 ...

  3. 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 ...

  4. c#和java中的方法覆盖——virtual、override、new

    多态和覆盖 多态是面向对象编程中最为重要的概念之一,而覆盖又是体现多态最重要的方面.对于像c#和java这样的面向对象编程的语言来说,实现了在编译时只检查接口是否具备,而不需关心最终的实现,即最终的实 ...

  5. java中的方法引用(method reference)官方文档总结

    2017/7/5 转载写明出处:http://www.cnblogs.com/daren-lin/p/java-method-reference.html 今天要说的是java中的一项新特性,方法引用 ...

  6. 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 ...

  7. Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.app.ActionBar.setDisplayShowHomeEnabled(boolean)' on a null object reference

    /********************************************************************************* * Caused by: java ...

  8. 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 ...

  9. java中什么是bridge method(桥接方法)

    java中什么是bridge method(桥接方法) https://blog.csdn.net/z69183787/article/details/81115524

随机推荐

  1. Oralce 常用语句

    注:大写代表需要替换掉额 --更新字段名 alter table TABLE rename column COL_OLD to COL_NEW --添加字段名 alter table TABLE ad ...

  2. Docker搭建便捷的开发者环境

    你可能遇到这样的场景:开发软件时,需要像数据库(mysql,mongodb).消息系统(rabbitmq).缓存服务(redis)等其它依赖服务.当然我们可以找台机器,一步步安装依赖,然后把所有依赖的 ...

  3. Date 对象转换——toString、toTimeString、toDateString、toUTCString、toLocaleString()、toLocaleTimeString()、toLocaleDateString()

    JavaScript toString() 方法 JavaScript Date 对象参考手册 定义和用法:toString() 方法可把 Date 对象转换为字符串,并返回结果. 语法:dateOb ...

  4. mysql 如何判断 "字符串" 是否为 "数字"

    这个问题有点怪 ,但很多时候我们会以字符串的形式存储数字 , 反过来我们用字符串进行数学运算时, 好像也不会出错 . 除非 , 用作数学运算的字符串不能转换成数字 .但是我们改如何判断字符串是否能转换 ...

  5. 【转】Android之自定义Adapter的ListView

    http://www.cnblogs.com/topcoderliu/archive/2011/05/07/2039862.html 在开发中,我们经常使用到ListView这个控件.Android的 ...

  6. background-attachment 定义背景图片随滚动轴的移动方式

  7. Android中使用反应式编程RxJava

    GitHut 地址: https://github.com/ReactiveX/RxAndroid (1)RxJava简介: RxJava 是一个在Java虚拟机上实现的响应式扩展库:提供了基于obs ...

  8. Codeforces Round #215 (Div. 2) B. Sereja and Suffixes

    #include <iostream> #include <vector> #include <algorithm> #include <set> us ...

  9. 【BZOJ4260】 Codechef REBXOR 可持久化Trie

    看到异或就去想前缀和(⊙o⊙) 这个就是正反做一遍最大异或和更新答案 最大异或就是很经典的可持久化Trie,从高到低贪心 WA: val&(1<<(base-1))得到的并不直接是 ...

  10. Socket 与 WebSocket

    本文转载自:http://zengrong.net/post/2199.htm 1. 概述 选择了 WebSocket 技术之后,不可避免的,我要将它和其他协议以及技术做一下比较.最常见的,就是需要比 ...