`
vipshichg
  • 浏览: 262070 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Java的动态绑定机制

    博客分类:
  • java
阅读更多

Java的动态绑定又称为运行时绑定。意思就是说,程序会在运行的时候自动选择调用哪儿个方法。

    public class Son extends Father  
    Son son = new Son();
     son.method();

 1、首先,编译器根据对象的声明类型和方法名,搜索相应类(Son)及其父类(Father)的“方法表”,找出所有访问属性为public的method方法。

  可能存在多个方法名为method的方法,只是参数类型或数量不同。

  2、然后,根据方法的“签名”找出完全匹配的方法。

  方法的名称和参数列表称为方法的签名。

  在Java SE 5.0 以前的版本中,覆盖父类的方法时,要求返回类型必须是一样的。现在子类覆盖父类的方法时,允许其返回类型定义为原始类型的子类型。

    public Father getFather(){...} //父类中的方法  
    public Son getFather(){...} //子类覆盖父类中的getFather()方法

 

  3、如果是private、static、final 方法或者是构造器,则编译器明确地知道要调用哪儿个方法,这种调用方式成为“静态调用”。

  4、调用方法。

  如果子类Son中定义了 method() 的方法,则直接调用子类中的相应方法;如果子类Son中没有定义相应的方法,则到其父类中寻找method()方法。

  二、Demo

  1、子类重写父类中的方法,调用子类中的方法

    public class Father{  
        public void method(){  
            System.out.println("父类方法:"+this.getClass());  
      }  
    }  
    public class Son extends Father{  
        public void method(){  
            System.out.println("子类方法"+this.getClass());  
    }  
    public static void main(String[] args){  
        Father instance = new Son();  
        instance.method();  
        }  
    }  
    //结果:子类方法:class Son

 2、子类没有重写父类中的方法,所以到父类中寻找相应的方法

    public class Father{  
        public void method(){  
            System.out.println("父类方法:"+this.getClass());  
        }  
    }  
    public class Son extends Father{  
        public static void main(String[] args){  
            Father instance = new Son();  
            instance.method();   
        }  
    }  
    //结果:父类方法:class Son

   三、动态绑定只是针对对象的方法,对于属性无效。因为属性不能被重写。

    public class Father{  
        public String name = "父亲属性";  
        }  
    public class Son extends Father{  
        public String name = "孩子属性";  
        public static void main(String[] args){  
            Father instance = new Son();  
            System.out.println(instance.name);  
        }  
    }  
    //结果:父亲属性

 

9
1
分享到:
评论
4 楼 yangkaiwdsc 2013-12-04  
yangkaiwdsc 写道
barryzhong 写道
引用
根据方法的“签名”找出完全匹配的方法。/quote]

这个需要仔细的定义。什么叫做完全匹配?print(char) 可否匹配到 print(short)还是print(int)呢


原文
2、然后,根据方法的“签名”找出完全匹配的方法。
  方法的名称和参数列表称为方法的签名
  在Java SE 5.0 以前的版本中,覆盖父类的方法时,要求返回类型必须是一样的。现在子类覆盖父类的方法时,允许其返回类型定义为原始类型的子类型。


我提问题的原因,是你这个理解的比较受限,并不是我对这个问题本身有疑问。一开始学习可以这么简单理解,但是记得回过头再理解。 我记得Core Java一书中有几段讲了重载解析和动态绑定,其中简单的提到这个过程极其复杂。导致当你声明Map map = new HashMap(); 相比 HashMap map = new HashMap(); 同样进行map.put操作时,动态绑定会产生一倍的开销,google android performance best practice提到动态绑定版本的map.put操作的开销声明本地变量的是160倍。


一楼的回复中,是我脑补不出动态绑定的开销问题,sorry,end
3 楼 barryzhong 2013-12-03  
barryzhong 写道
引用
根据方法的“签名”找出完全匹配的方法。/quote]

这个需要仔细的定义。什么叫做完全匹配?print(char) 可否匹配到 print(short)还是print(int)呢


原文
2、然后,根据方法的“签名”找出完全匹配的方法。
  方法的名称和参数列表称为方法的签名
  在Java SE 5.0 以前的版本中,覆盖父类的方法时,要求返回类型必须是一样的。现在子类覆盖父类的方法时,允许其返回类型定义为原始类型的子类型。


我提问题的原因,是你这个理解的比较受限,并不是我对这个问题本身有疑问。一开始学习可以这么简单理解,但是记得回过头再理解。 我记得Core Java一书中有几段讲了重载解析和动态绑定,其中简单的提到这个过程极其复杂。导致当你声明Map map = new HashMap(); 相比 HashMap map = new HashMap(); 同样进行map.put操作时,动态绑定会产生一倍的开销,google android performance best practice提到动态绑定版本的map.put操作的开销声明本地变量的是160倍。
2 楼 yangkaiwdsc 2013-12-03  
引用
根据方法的“签名”找出完全匹配的方法。/quote]

这个需要仔细的定义。什么叫做完全匹配?print(char) 可否匹配到 print(short)还是print(int)呢


原文
2、然后,根据方法的“签名”找出完全匹配的方法。
  方法的名称和参数列表称为方法的签名
  在Java SE 5.0 以前的版本中,覆盖父类的方法时,要求返回类型必须是一样的。现在子类覆盖父类的方法时,允许其返回类型定义为原始类型的子类型。
1 楼 barryzhong 2013-12-02  
根据方法的“签名”找出完全匹配的方法。/quote]

这个需要仔细的定义。什么叫做完全匹配?print(char) 可否匹配到 print(short)还是print(int)呢

相关推荐

    Java动态绑定机制的内幕

    这篇文章我们将揭露JVM方法调用的静态(static binding) 和动态绑定机制(auto binding) 。  静态绑定机制 //被调用的类 package hr.test; class Father{ public static void f1(){ System.out.println(...

    JAVA反射机制的简单理解

    我们朗朗上口动态绑定(dynamic binding)、动态链接(dynamic linking)、动态加载(dynamic loading)等。然而“动态”一词其实没有绝对而普遍适用的严格 定义,有时候甚至像对象导向当初被导入编程领域一样,...

    Java高级:动态绑定实现机制

    动态绑定为解决实际的业务问题提供了很大的灵活性,是一种非常优美的机制。  1. Java对象模型  Java虚拟机规范并没有规定Java对象在堆里是如何表示的。对象的内部表示也影响着整个堆以及垃圾收集器的设计,它由...

    候捷谈Java反射机制

    这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。  Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的...

    Java的静态/动态绑定

    看到《Java核心技术I》书上的动态绑定,意思是当子类和父类存在同一个方法,子类重写了父类的方法,程序在运行时调用方法是调用父类的方法还是子类的重写方法呢?程序会在运行的时候自动选择调用某个方法(根据方法...

    XML与Java技术:用Castor进行数据绑定

    对于主要关心文档数据内容的应用程序,Java XML数据绑定是一种代替XML文档模型的强大机制。本文中将介绍数据绑定,并讨论什么使它如此令人瞩目。然后,展示如何利用Java数据绑定的开放源代码Castor框架来处理日益...

    将Java对象和XML自动绑定的Castor1.3API

    提供处理XML、Directory、XADirectory的类库,提供从XML到JAVA类的转换机制。  Castor(http://castor.exolab.org/)是一种将Java对象和XML自动绑定的开源软件。它可以在Java对象、XML文本、SQL数据表以及LDAP目录...

    使用truelicense实现用于JAVA工程license机制(包括license生成和验证)

    使用truelicense进行Java程序license控制 经过扩张可以验证license 开始结束日期,...使用truelicense实现用于JAVA工程license机制(包括license生成和验证) 其中包括license授权机制的原理和制作license的具体步骤

    JAVA_API1.6文档(中文)

    java.awt.dnd Drag 和 Drop 是一种直接操作动作,在许多图形用户界面系统中都会遇到它,它提供了一种机制,能够在两个与 GUI 中显示元素逻辑相关的实体之间传输信息。 java.awt.event 提供处理由 AWT 组件所激发的...

    java学习路线.pdf

    它还提供了动态绑定和反射等高级功能。 Java语言的一个重要特性是其健壮性。Java的强类型机制、异常处理机制和垃圾自动收集等机制,都极大地增强了Java程序的健壮性。 Java的另一个重要特性是其安全性。Java提供了...

    Java 1.6 API 中文 New

    java.awt.dnd Drag 和 Drop 是一种直接操作动作,在许多图形用户界面系统中都会遇到它,它提供了一种机制,能够在两个与 GUI 中显示元素逻辑相关的实体之间传输信息。 java.awt.event 提供处理由 AWT 组件所激发的...

    JAVA上百实例源码以及开源项目源代码

    Java 源码包 Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来...

    JAVA上百实例源码以及开源项目

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    java开源包4

    JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...

    java开源包101

    JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...

    java开源包11

    JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...

    java开源包6

    JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...

    java开源包9

    JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...

    java开源包5

    JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...

Global site tag (gtag.js) - Google Analytics