`
vipshichg
  • 浏览: 267391 次
  • 性别: 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动态绑定和内联

    动态绑定的内部机制涉及到对象的内部表示和方法表。在Java对象模型中,每个对象都包含实例变量和指向类方法区的指针,方法区存储着类的方法数据,包括方法的字节码。方法表是一个指向方法区中方法指针的数组,其中...

    java动态绑定和静态绑定用法实例详解

    Java中存在两种类型的绑定机制:静态绑定和动态绑定。 静态绑定是指在程序执行以前已经被绑定(即在编译过程中就已经知道这个方法到底是哪个类中的方法)。在Java中,final、static、private修饰的方法和构造方法是...

    Java中的静态绑定和动态绑定Java开发Java经验技巧

    了解这些绑定机制有助于我们编写更加高效、灵活的代码。在设计类和对象时,合理运用静态绑定和动态绑定可以优化性能,提高代码的可维护性。比如,如果我们需要确保方法的调用总是指向同一实现,可以选择静态绑定;而...

    java代码绑定时间

    综上所述,合理利用Oracle的绑定变量机制是Java开发者优化数据库性能的重要手段之一。它不仅可以避免不必要的硬解析,减轻CPU和闩锁资源的压力,还能优化共享池的管理,提升系统的并发处理能力和响应速度。在实际...

    Java动态绑定的方法重载的实现.zip

    总之,Java中的动态绑定和方法重载是实现面向对象编程的重要机制,它们共同为开发者提供了更强大、更灵活的代码设计工具。理解并熟练运用这两个概念,将有助于编写出更加高效、可维护的Java代码。

    理解Java中的静态绑定和动态绑定

    在Java编程语言中,静态绑定和动态绑定是两种不同的方法调用机制,它们与面向对象编程密切相关。这两种绑定方式决定了程序在运行时如何选择和执行特定的方法。 静态绑定(早期绑定),也称为编译时绑定,是指在程序...

    java的映射机制

    ### Java的映射机制深入解析 Java的映射机制是其框架设计与应用开发中的核心概念之一,尤其...无论是数据绑定、异常处理还是业务流程控制,映射机制都发挥着不可或缺的作用,是每个Java开发者应该掌握的关键技术之一。

    深入浅出Java语言程序设计

    - **多态**:一个接口可以有多种不同的实现,是Java动态绑定机制的体现。 4. **异常处理** - **异常**:Java中的错误和异常是通过异常类来表示的,异常处理机制使得程序更加健壮。 - **try-catch-finally**:...

    访问者模式商量篇:java的动态绑定与双分派_.docx

    在Java编程中,动态绑定和静态绑定是两种不同的方法调用机制,它们分别适用于不同的场景。动态绑定,也称为晚期绑定或多态性,是指在程序运行时根据对象的实际类型来决定调用哪个方法。静态绑定,又称为早期绑定,是...

    动态绑定实现原理2

    总的来说,Java的动态绑定机制通过对象内存模型中的方法表和运行时类型信息,实现了在运行时根据对象实际类型选择相应方法的调用。这种机制增强了Java的多态性,提高了代码的灵活性和可维护性,是Java语言设计的关键...

    java事件处理机制Demo

    Java事件处理机制是Java编程中一个重要的组成部分,它主要用于实现用户界面(UI)与应用程序逻辑之间的交互。在Java中,事件处理主要涉及到事件源、事件和事件监听器。本示例"java事件处理机制Demo"将深入探讨Java的...

    Java反射机制 Java反射机制

    随着面向对象编程的发展,动态类型和动态绑定的概念逐渐成熟,这为Java反射机制的出现奠定了基础。Java反射机制在JDK 1.1版本中就已经引入,但在JDK 1.5之后得到了进一步增强和完善,增加了泛型支持等功能,使得反射...

    java调用大漠插件源码,绑定游戏柄口,进行后台操作

    描述中提到“绑定游戏柄口”,这通常是指通过Java程序与游戏控制器进行通信,允许用户通过游戏手柄进行操作,同时这些操作可以通过大漠插件在后台执行。这意味着用户可以隐藏或最小化应用程序,而程序仍然可以继续...

    Java XML绑定技术 (Castor JAXB XMLBeans)

    它是Java EE标准的一部分,提供了一种机制来将Java对象与XML文档相互转换。使用JAXB,可以通过简单的API调用来序列化和反序列化Java对象为XML文档,反之亦然。 **特点:** - **简单易用**:只需在Java类上添加一些...

    Java 动态树 dhtmlxtree

    5. **数据绑定**:可以将树结构与数据库或其他数据源绑定,动态加载数据,实现数据的增删查改。 6. **API支持**:dhtmlxtree提供了丰富的JavaScript API,用于控制树的各个方面,如获取选中的节点、添加新节点、...

    Java中的反射机制

    通过这些方法,开发者可以动态地获取类的信息,进而进行动态绑定、实例化对象、调用方法等高级操作。 ### 总结 Java中的反射机制为开发者提供了一种强大而灵活的方式来处理类信息。通过反射,可以实现诸如动态代理...

    Java中的静态绑定和动态绑定详细介绍

    总的来说,静态绑定和动态绑定都是Java中实现多态和灵活代码的重要机制。静态绑定在编译阶段就决定了方法调用,基于方法签名进行选择;动态绑定则在运行时根据对象的实际类型确定方法实现,实现了“面向接口编程”的...

    Java反射机制与动态代理

    反射机制的核心在于能够在运行时动态地获取类的信息并进行操作,这为Java提供了高度的灵活性和动态性。 1. **Java反射机制的基本功能** - 获取类信息:通过`Class`类的`forName()`方法,可以得到运行时的类信息。 ...

Global site tag (gtag.js) - Google Analytics