`

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]

相关推荐

    微型数据绑定和校验框架form-binder-java.zip

    form-binder-java 是一个容易使用和定制的微型数据绑定和校验框架,是 form-binder 的 Java 移植版。用 Java 8 实现,运行时要求 Java 8。 它有如下特点: 非常轻量,总共才 1500 来行代码(框架 ...

    JAVA基础课程讲义

    动态绑定 77 多态的使用要点 78 对象的转型(casting) 79 final 81 抽象类 82 抽象类的使用要点 83 接口 83 为什么需要接口? 84 如何定义接口? 84 接口的本质探讨 84 接口使用要点 85 接口的多继承 86 面向接口编程 ...

    Java编程思想(完整版)

    1.6.1 动态绑定 1.6.2 抽象的基础类和接口 1.7 对象的创建和存在时间 1.7.1 集合与继承器 1.7.2 单根结构 1.7.3 集合库与方便使用集合 1.7.4 清除时的困境:由谁负责清除? 1.8 违例控制:解决错误 1.9 多线程 1.10 ...

    Java游戏服务器热更例子。此热更新方法采用启用后更新。即游戏服务器在运行中如果出现bug,采用pid绑定的方式更新

    Java语言游戏项目实战资源包 内容概览: 这次分享为你带来了丰富的Java语言游戏项目实战资源,让你在实践中深入掌握Java语言,并开启游戏开发之旅。资源包中包括: 游戏项目代码:精心挑选了多个经典的小游戏项目...

    AIC的Java课程1-6章

     掌握package(又称默认,友元)控制符,系统掌握4种访问控制符 第6章 面向对象(多态) 4课时  理解多态的概念,不关心具体细节,以抽象一般的思维方式考虑问题(同一接口,不同实现)。...

    java 面试题 总结

    抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。 2.继承: 继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性...

    Java面试题.docx

    继承让变化中的软件系统有了一定的延续性,同时继承也是封装程序中可变因素的重要手段(如果不能理解请阅读阎宏博士的《Java与模式》或《设计模式精解》中关于桥梁模式的部分)。 - 封装:通常认为封装是把数据和...

    JavaServer Faces 2.0完全参考手册(JSF2.0中文版) 1/2

    7.4.2 在JSF视图中绑定用户界面组件的有用建议 第8章 数据转换与数据验证 8.1 验证和转换的示例 8.2 转换和验证揭秘 8.3 Faces转换器系统 8.3.1 Date Time Converter 8.3.2 Number Converter 8.3.3 关联转换器与UI ...

    JavaServer Faces 2.0完全参考手册(JSF2.0中文版).part1

    7.4.2 在JSF视图中绑定用户界面组件的有用建议 第8章 数据转换与数据验证 8.1 验证和转换的示例 8.2 转换和验证揭秘 8.3 Faces转换器系统 8.3.1 Date Time Converter 8.3.2 Number Converter 8.3.3 关联转换器与UI ...

    java猜数字源码-JacobMathType:JACOB是一个Java到微软的COM接口的桥梁。使用JACOB允许任何JVM访问COM对象,

    java猜数字源码 JacobMathType Jacob JACOB是一个 Java到微软的COM接口的桥梁。使用JACOB允许任何JVM访问COM对象,从而使...组件的细节,虽然框架为您完成了大部分的生成 Bridge 代码的工作,但是总体来说,编码工作量

    java server face 教程

    签,另一件事就是与程序设计人员沟通好各个Bean 的名称绑定。 • 标签入门 卷标的相关属性查询,您可以参考 Tag Library Documentation,这边的介绍只 是一些简单的入门实例。 o 简介 JSF 标准标签 o 输出类标签 o ...

    超级有影响力霸气的Java面试题大全文档

    抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。 2.继承:  继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确...

    Java相关的面试题总结(1).docx

    我们在类中编写的方法就是对实现细节的一种封装;我们编写一个类就是对数据和数据操作的封装。可以说,封装就是隐藏一切可隐藏的东西,只向外界提供最简单的编程接口 多态性:多态性是指允许不同子类型的对象对...

    Java面试题1.docx

    抽象只关注对象有哪些属性和行为,并不关注这些行为的细节是什么。 - 继承:继承是从已有类得到继承信息创建新类的过程。提供继承的类叫父类(超类、基类)、得到继承的类叫子类(派生类)。 - 封装:通常认为封装是...

    Java面试题-面向对象、多线程.pdf

    (如果不能理解请阅读阎宏博士的《Java与模式》或《设计模式精解》中关于桥梁模 式的部分)。 - 封装:通常认为封装是把数据和操作数据的方法绑定起来, 对数据的访问只能通过已定义的接口。面向对象的本质就是 ...

    Tomcat与Java.Web开发技术详解

    本书是一本内容编排比较奇特的教材,主要特点是将JavaWeb开发的原理和技术细节同实例非常紧密的绑定了。从内容的编排来看,作者是相当用心的,总体的质量不错。因此,对于有较充分时间安排的初学者,或者是已经有...

    binding-tc:AEB-Android简易装订。 绑定到业务对象(称为POJO)的Android View属性

    #绑定细节 使用范例 以POJO方式声明的典型业务对象(具有可观察模式): public class Pin extends Observable { private String mPassword; private String mConfirmPassword; /* * Calculated m

    学习Java,你需要知道这些——接口与多态

    文章目录接口接口的作用接口的语法实现接口实现多个接口的语法接口的扩展类型转换类型转换的...这样可以最大限度地利用动态绑定隐藏实现细节。 实现不同类之间的常量共享。 接口的语法 声明格式为 [接口修饰符] inte

    ca源码java-captcha:行为验证码(滑动拼图、点选文字),前后端(java)交互,包含h5/Android/IOS/flutter/

    ca原始Java AjPlus验证码 1.在线演示 1.1 1.2 1.3 Wechat / H5演示(基于uni-app) 也可以看看 微信演示 2.设计细节 2.1 UI组件 支持Android,iOS,Futter,Uni-App,ReactNative,Vue,Angular,Html,Php。 ...

Global site tag (gtag.js) - Google Analytics