`

Java动态绑定的细节

阅读更多
首先,存在一些从来不能使用动态绑定的情况。
  • 静态方法:不管这个办法怎么被调用
  • 最终方法
  • 私有方法(因为它们只能从类的内部被调用,因此是隐式的最终方法)

动态绑定意味着:目前正在调用的方法正是最适用于要操作对象的那个方法。然而它并不意味着对所有的参数都执行最佳匹配。
在Java中,一个方法的参数在编译阶段常被静态地绑定。

一个例子:
class Base{
    public void foo(Base x){
        System.out.println("Base.Base");
    }
    
    public void foo(Derived x){
        System.out.println("Base.Derived");
    }
}
 

class Derived extends Base{
  public void foo(Base x){
        System.out.println("Derived.Base");
    }
    
    public void foo(Derived x){
        System.out.println("Derived.Derived");
    }
}
 

class Main{
    public static void whichFoo(Base arg1, Base arg2){
        arg1.foo(arg2);
    }

    public static void main(String[] args)}{
        Base b = new Base();
        Derived d = new Derived();
    
        whichFoo(b,b);
        whichFoo(b,d);
        whichFoo(d,b);
        whichFoo(d,d);            
    }
}
 

因为参数通常在编译阶段被匹配,在whichFoo方法中,形式参数arg2的类型是Base, 因此不管arg2实际引用的是什么类型,arg1.foo(arg2)匹配的foo都将是:
public void foo(Base x)

惟一的问题在于用Base还是Derived版本中的foo(Base x)函数?当知道arg1引用的对象时,这是在运行阶段要决定的。

精确使用的方法是编译器绑定,在编译阶段,最佳方法名依赖于参数的静态和控制引用的静态类型所适合的方法。在这一点上,设置方法的名称,这一步叫静态重载
决定方法是哪一个类的版本,这通过由虚拟机推断出这个对象的运行时类型来完成,一旦知道运行时类型,虚拟机就唤起继承机制,寻找方法的最终版本。这叫做动态绑定

在方法whichFoor的调用arg1.foo(arg2),将根据arg1的运行时类型是Base还是Derived来调用Base类或者Derived类中的foo(Base x)版本函数。

由此理解方法的覆盖重载。重载函数的实际调用版本由编译器绑定决定,而覆盖函数的实际调用版本由动态绑定决定。
分享到:
评论
1 楼 whywhy24 2012-04-10  
[b][/b][i][/i][img [/url][url][/url][url][/url][url][/url][url][/url][url][/url][url][url][/url][flash=200,200][/flash]
][/img]
[size=xx-small][/size][align=left][/align]

相关推荐

    JComboBox动态绑定数据库

    本实例是关于如何将`Sql2000`数据库中的数据与`JComboBox`进行动态绑定,通过`JDBC`(Java Database Connectivity)接口来实现数据库连接和数据交互。 首先,我们需要理解`JComboBox`的基本用法。`JComboBox`是...

    ZeroMQ及java绑定

    在Java环境中,为了利用ZeroMQ的功能,通常需要通过Java绑定来实现,这就是所谓的“ZeroMQ及Java绑定”。 首先,ZeroMQ的核心是libzmq.dll,这是一个动态链接库,它实现了ZeroMQ的所有底层功能。在Windows系统中,...

    Java与XML数据绑定

    Java与XML数据绑定是将Java对象与XML文档之间的映射关系进行自动化处理的一种技术,它极大地简化了在Java应用中处理XML数据的工作流程。在Java世界中,JAXB(Java Architecture for XML Binding)是Java EE平台的一...

    Java XML绑定技术 (Castor JAXB XMLBeans)

    Java XML绑定技术极大地简化了XML文档的操作过程,使开发人员能够更加专注于业务逻辑而不是XML细节。JAXB、XMLBeans和Castor各有优势,选择哪个框架取决于具体的应用场景和个人喜好。无论哪种框架,都能有效提高开发...

    动态任务调用_java动态任务_beltduu_

    在Java编程领域,动态任务调用是一个重要的概念,它允许我们在程序运行时创建、查询、启动、调用和删除任务,极大地增强了程序的灵活性和可扩展性。在本篇文章中,我们将深入探讨Java中的动态任务调度,特别是使用...

    java源码:Java本地代码绑定工具 jSegue.zip

    - 简化接口定义:jSegue通过自动生成JNI头文件和Java绑定类,减少了手动编写JNI代码的工作量。 - 易于使用:jSegue提供了直观的API,使得Java开发者可以像调用Java方法一样调用本地函数。 - 安全性:jSegue可能...

    详解Java多态对象的类型转换与动态绑定

    在Java中,多态性体现在两个方面:静态绑定(编译时绑定)和动态绑定(运行时绑定)。动态绑定是多态性实现的关键,它确保了程序在运行时能够根据实际的对象类型来调用相应的方法。 首先,我们来讨论类型转换。在...

    语义推理的功能组件动态绑定研究.docx

    语义推理的功能组件动态绑定是现代软件开发中的一个重要研究领域,尤其在Web服务和面向服务架构(SOA)中占据核心地位。随着软件系统变得越来越复杂,基于组件的软件开发(CBSD)成为提高代码复用性和灵活性的有效...

    Castor的使用,如何将java object转换为xml

    Castor是一个开源的数据绑定框架,它允许Java开发者在Java对象和XML之间进行无缝转换。这个强大的工具能够将复杂的Java对象模型映射到XML文档,同时也能够将XML数据解析回等效的Java对象,极大地简化了Java应用中的...

    使用域名绑定tomcat

    Tomcat是Apache软件基金会的一个开源项目,它是一个轻量级的应用服务器,主要用于处理Java Servlet和JavaServer Pages(JSP)。当我们需要让多个网站或者应用在同一台服务器上运行时,就需要通过域名绑定来区分它们...

    java和JavaScript开发细节

    #### 三、Java开发细节 除了上述提到的JavaScript注意事项外,在Java开发过程中,还需要关注以下几点: 1. **类型转换:** 在进行基本类型的转换时(如`byte`到`short`、`int`到`long`),要特别小心,确保转换...

    java调用js代码实现动态配置

    ### Java调用JS代码实现动态配置 在现代软件开发中,动态配置的需求越来越普遍,特别是在不希望频繁重启服务的情况下更新业务逻辑或算法时。本文将详细介绍如何利用Java调用JavaScript来实现这一目标,并通过一个...

    基于java的开发源码-本地代码绑定工具 jSegue.zip

    《深入解析Java本地代码绑定工具jSegue》 在软件开发过程中,有时我们需要将Java代码与本地(Native)代码集成,以便利用C、C++等语言的高性能特性或调用特定平台的功能。Java本地接口(JNI)是Java平台提供的一种...

    Java虚拟机规范(Java SE 7)

    3. invokedynamic指令:这是Java 7引入的一个新字节码指令,用于动态语言支持,允许在运行时动态绑定方法调用,提高了脚本语言的性能。 4. 并发与多线程:Java SE 7提供了新的并发工具,如Fork/Join框架,用于解决...

    使用java生成动态数据的pdf文件

    然后,这些数据被传递给前端,而不是让Java直接处理PDF的渲染细节。 “使用Vue进行数据映射和页面渲染,符合前端开发思路,前后分离”这部分表明我们利用Vue.js这个流行的JavaScript框架来处理前端部分。Vue.js擅长...

    基于java的企业级应用开发:数据绑定介绍.ppt

    通过使用Spring MVC的数据绑定机制,开发者可以更加专注于业务逻辑的实现,而不是繁琐的数据处理细节。因此,在实际开发中,合理运用数据绑定能够提高开发效率,降低出错概率,是构建高效企业级应用的必备技能。

Global site tag (gtag.js) - Google Analytics