zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    菜鸟学IT之豆瓣爬取初体验
    菜鸟学IT之python网页爬取多页爬取
    菜鸟学IT之python网页爬取初体验
    菜鸟学IT之python词云初体验
    菜鸟学IT之python3关于列表,元组,字典,集合浅认识!
    整合ssm框架
    MyBatis
    服务出现服务名无效的原因及解决方法
    数据库(三)
    数据库(二)
  • 原文地址:https://www.cnblogs.com/cuglkb/p/5728435.html
Copyright © 2011-2022 走看看