精华内容
下载资源
问答
  • 主要介绍了java动态绑定和静态绑定用法,结合实例形式详细分析了java动态绑定与静态绑定相关概念、原理、实现方法及使用注意事项,需要的朋友可以参考下
  • Java动态绑定和内联

    2014-09-09 23:22:23
    非常详细的介绍了Java动态绑定和内联,还运用了大量的例子,值得一看!
  • 详解Java动态绑定和静态绑定机制

    千次阅读 2019-04-22 09:27:42
    https://jiayouxujin.github.io/2019/04/20/java动态绑定和静态绑定详解/ 这一次,彻底搞懂动态绑定和静态绑定机制

    https://jiayouxujin.github.io/2019/04/20/java动态绑定和静态绑定详解/
    这一次,彻底搞懂动态绑定和静态绑定机制

    展开全文
  • Java动态绑定的方法重载的实现.pdf
  • Java动态绑定的方法重载的实现
  • 详细介绍了java动态绑定和静态绑定的区别
  • Java动态绑定与静态绑定之胡思乱想

    千次阅读 2018-04-02 21:52:30
    Java动态绑定与静态绑定之胡思乱想 之所以写这篇博客,是因为写代码过程中遇到了很奇怪的现象,我觉得只能通过动态绑定与静态绑定来解释,于是,就学习了一下动态绑定与静态绑定的实现原理,这个过程中确实学到了...

    Java动态绑定与静态绑定之胡思乱想

    之所以写这篇博客,是因为写代码过程中遇到了很奇怪的现象,我觉得只能通过动态绑定与静态绑定来解释,于是,就学习了一下动态绑定与静态绑定的实现原理,这个过程中确实学到了很多,怕以后忘了,所以用博客的形式记录下来。
    为啥叫胡思乱想呢,是因为这篇博客主要记录的是我学到的内容和我的一些疑问与解答,并没有很强的逻辑性,所以就叫胡思乱想啦!

    Java动态绑定与静态绑定的实现原理

    关于实现原理,规范且准确的解释,在这里可以找到。
    下面我想用自己的话概括一下,从而使自己更好的理解。

    静态绑定实现原理:当初次调用一个使用静态绑定的方法时,java字节码层面是去调用常量池中的某一个常量表,这个常量表描述了这个方法的具体信息(包括详细的类名,函数名称,返回值,存在CONSTANT_Methodref_info这个结构当中)。这时,JVM会首先去加载这个函数所属的类(在这个类之前没有被加载过的情况下),然后,根据方法的具体信息,在对应的类的方法表(Method table)中查找方法代码的具体地址,找到后,直接放入常量池中,放入位置为对应的常量表的位置。这个过程叫做常量池解析。经过解析之后,当第二次调用这个方法时,由于常量池中存的就是地址,所以不需要再次解析,直接利用地址去执行相应的代码块即可!

    动态绑定实现原理:采用动态绑定的方法的常量池解析过程与静态绑定类似,不同之处在于,替换相应的常量表的不是代码块的具体地址,而是函数在方法表中的index(根据方法表的设计,子类与父类相同的方法在方法表中会具有相同的index)。等到运行时,再根据调用这个函数的实际实例的类型,由此类型去找到此类对应的方法表,再由方法表去找到实际的代码块的位置。通过多一步的解析,我们就实现了动态绑定!

    为了更好理解,放两张图吧:
    第一张是常量池的图:
    这里写图片描述
    在这个常量池中,有28项,每一项都称之为一个常量表,都有相应的结构。共有以下几种类型:
    这里写图片描述
    而CONSTANT_Methodref_info的结构如下:
    这里写图片描述
    tag(1 byte)即标记位,class_index(2 bytes)指向一个CONSTANT_Class_info数据项, 这个数据项表示被引用的方法所在的类型(类)name_and_type_index(2 bytes)指向一个CONSTANT_NameAndType_info,这个CONSTANT_NameAndType_info描述的是被引用的方法的名称和描述符。

    然后是一个方法表(Method table)的图:
    这里写图片描述
    从中我们可以看到,子类是会将父类的方法表拷贝下来,然后再增添新的内容,如果重写,则会修改相应的函数的地址。(这也就说明了同样的函数在子类,父类的方法表中的index是一样的)


    ## 胡思乱想 知道了动态绑定与静态绑定的工作原理,就开始胡思乱想啦 1.什么样的方法使用静态绑定?什么样的方法使用动态绑定呢? 答:用static,final,private修饰的方法,以及构造方法,都是静态绑定。而其他的方法,就采用动态绑定咯!

    2.那对于虚拟机来说,怎么确定使用静态绑定还是动态绑定呢?
    答:在Java字节码中,调用函数共有五个指令:invokestatic,invokespecial,invokevirtual,invokeinterface,invokedynamic。而1中提到的应该使用静态绑定的函数都是通过invokestatic和invokespecial这两个来调用的,所以,虚拟机看到这两个指令,就明白应该采用静态绑定啦,而其余的则使用动态绑定!

    3.重写和重载分别用的什么绑定呢?
    答:显然,重写使用的是动态绑定,而重载,多个函数不同之处在于参数列表,所以,在他们之间,采用静态绑定即可。

    4.明白了动态绑定与静态绑定的原理,对你写代码有什么启示啊?
    答:可以发现,如果使用静态绑定,在类的加载过程中会比较缓慢,而之后的调用则会变得很快;而如果使用动态绑定的话,在运行时还需要解析,会降低程序的运行速度。所以,我觉得可以在代码中适当的使用final这样的修饰词来提高程序运行时的速度。当然,过于频繁的使用也会带来程序拓展性差,加载时间过长等弊端,还是需要根据实际情况来trade-off的!

    5.你前面都在说方法,那你知道变量是静态连接还是动态连接的吗?
    答:先说答案,**变量采用的是静态连接。**这正是开篇讲的写程序时遇到的困扰我的问题,也正是由于此,我才想到了要学习静态绑定与动态绑定。下面,让代码来说话。
    先看一个很奇妙的现象:
    这里写图片描述
    这里写图片描述
    这里写图片描述
    以上代码的输出如下:
    这里写图片描述
    我们发现,直接访问属性value,访问到的是父类的;而访问方法,又访问到的是子类的。这当时给我造成了极大的困扰,实际,这个现象可以用动态绑定与静态绑定的知识来解答,那就是:**属性采取的是静态绑定!而sayHello()这个方法采用了动态绑定!**正是这个原因,当你将a声明为A类型时,在编译阶段,value就已经绑定为了类A的value,而对于sayHello()来说,则采取的动态绑定,所以,到运行时,发现实际类型是A1,自然就运行的是A1的sayHello()。

    基于属性是静态绑定这个事实,也就可以很容易的解释:在继承中,属性只能被隐藏,而方法可以被覆盖或隐藏(静态的方法是隐藏)。
    覆盖的意思就是说你把子类看成父类,访问到的依然是子类的;而隐藏的话,你把子类看成父类,访问到的就是父类的了。
    将上面的代码略微改动之后如下:
    这里写图片描述
    这里写图片描述
    这里写图片描述
    这里写图片描述
    我们在子类A1中使用int型的value去覆盖了父类的String型value,并重写(覆盖)了sayHello()方法,输出结果与我们之前所述一致。

    6.请问,在在父类,有个int value,你可以在子类中定义 boolean value,但是,如果父类中有个public int get(),你却不能在子类中定义public boolean get()。这是为什么?
    答:根据5中的分析,由于变量采用静态绑定,并且是隐藏,所以,子类可以完全自由的用和父类变量一样的变量名字,并且采用不同的修饰符,静态绑定会确保正确性。而对于方法,子类是会继承的,并且采取动态绑定(覆盖),如果你既有public int get(),又有public boolean get(),那当你调用get()时,怎么知道调用哪个呢?所以这样是不允许的!

    补充(2018.5.4):上面的回答从底层实现的角度阐释了为什么不允许通过不同的返回值类型来进行重载或重写,今天在读《Thinking in java》这本书时,看到了设计层面的回答:如果允许通过不同的返回值进行重载或重写,如果你在调用函数时左端使用相应的类型来接收返回值的话,这样依然可以分辨调用的是哪个函数,如下:

    int say(){
    	return 1;
    }
    String say(){
    	return "hello";
    }
    int x=say();
    String y=say();
    

    但是,在某些情况下,我们可能只想执行一下函数,而不关心返回值,这时,我们可能这样写代码:

    int say(){
    	return 1;
    }
    String say(){
    	return "hello";
    }
    say();
    

    当这种情况出现时,就无法分辨应该调用哪个say()了,因此,不允许通过不同的返回值类型来进行重载或重写。

    7.通过学习静态绑定与动态绑定的原理,你也应该能很准确的解释 为什么你声明为哪个类,就只能执行这个类中拥有的方法(因为常量池解析时是根据你声明的类型的方法表来做的,而不是根据实际类型!),并且,子类没有重写的话执行的是父类的方法(因为方法表的继承呀!)。

    8.加深理解的一段代码:

    class SuperClass {
        public void fun(int i) {
            System.out.println("Integer: " + i);
        }
    }
    
    class SubClass extends SuperClass {
        public void fun(char c) {
            System.out.println("Character: " + c);
        }
    }
    
    
    public class Test {
        public static void main(String[] args) {
            SuperClass superClass = new SubClass();
            char c = 'a';
            superClass.fun(c); // Integer: 97
        }
    }
    

    这个结果,一不小心就会搞错,很容易会觉得应该输出的是 Character a。但你仔细一想,父类中都没有接收char参数的函数,编译是怎么通过的呢?原来,是因为编译器找不到char而做了让步,因为char可以隐式转为int,所以,编译器就找了这么一个“凑合的方法”,这样,在常量池解析时,就变成了调用的是参数为int的方法,而运行时,子类又没有重写这个参数为int的方法,所以,就调用的父类的啦!

    9.对动态绑定和静态绑定的一个总结:
    这里写图片描述
    (注:此图来源于知乎)

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

    千次阅读 2009-11-07 18:24:00
    /** * java动态绑定与转型 * * 动态绑定 Java中除了static和final方法外,其他所有的方法都是运行时绑定的。 * 转型:如果把引用变量转换成子类类型称为向下转型,把引用变量转换成父类类型称为向上转型。 * * 对于...

     

    展开全文
  • java 动态绑定与c++动态绑定区别

    千次阅读 2013-03-14 23:03:15
    从c++到java(四) 静态绑定动态绑定(上)  对比下面,在同样不使用虑函数的情况下,指向导出类的基类指针在调用导出类中重载了的方法时结果不同。 C++代码: class A{  public:  void ...

    从c++到java(四) 静态绑定与动态绑定(上)  

    对比下面,在同样不使用虑函数的情况下,指向导出类的基类指针在调用导出类中重载了的方法时结果不同。

    C++代码:

    class A{

        public:

           void f1(){cout << "class A\n" ;}

        };

    class B :public A {

        public:

           void f1(){cout << "classB\n";}

        };

    void main()   {

           A *a = new B;

           a -> f1();

           delete a; 

        }

    输出结果:

        Class A

     

    Java代码:

    class A {

        public void show(){System.out.println("class a");}

    }

    class B extends A{

        public void show(){System.out.println("class b");}

    }

    public class Main {

        public static void main(String[] args) {

           A a = new B();

           a.show();

    }

    输出结果:

    class b

     

    如果使用了虚函数c++java的结果一样。

     

    产生以上差异是不同语言的绑定方式不同造成的。绑定指的是一个方法的调用与方法所在的类(方法主体)关联起来。绑定分为静态绑定和动态绑定;或者叫做前期绑定和后期绑定。静态绑定可以理解为程序在编译期进行的绑定,而动态绑定指在运行时根据具体对象的类型进行绑定。

    java中只有finalstaticprivate和构造方法是静态绑定的,其它所有方法都采用动态绑定。而c++中是进行的是静态绑定,只有虚函数进行的是动态绑定。所以c++A类的指针只会调用A类的方法,虽然它指向的是一个B类的对象。而在java中虽然引用是A类的,但是由于动态绑定的关系,当通过方法名调用方法时,jvm会判断出当前对象的类型是B而不是A,所以会调用B类的中的相应方法。


    展开全文
  • JAVA动态绑定的内部实现机制

    万次阅读 多人点赞 2010-05-08 13:32:00
    JAVA动态绑定的内部实现机制 JAVA虚拟机调用一个类方法时,它会基于对象引用的类型(通常在编译时可知)来选择所调用的方法。相反,当虚拟机调用一个实例方法时,它会基于对象实际的类型(只能在运行时得知)来选择所...
  • Java 动态绑定详解

    千次阅读 2011-03-20 18:54:00
    这里特别说明一点,java当中的方法只有final,static,private和构造方法是前期绑定动态绑定:后期绑定:在运行时根据具体对象的类型进行绑定。若一种语言实现了后期绑定,同时必须提供一些机制,可在运行期间判断...
  • 【解惑】Java动态绑定机制的内幕

    千次阅读 2016-08-04 11:35:33
    Java方法调用的过程... 这篇文章我们就将揭露JVM方法调用的静态(static binding) 和动态绑定机制(auto binding) 。     ★ 静态绑定机制 Java代码  //被调用的类  package hr.test;  class Father{
  • java 动态绑定 以及 内部实现机制

    千次阅读 2012-04-28 12:25:38
    java来说,绑定分为静态绑定动态绑定;或者叫做前期绑定和后期绑定。  (1)静态绑定:  在程序执行前方法已经被绑定,此时由编译器或其它连接程序实现。例如:C。  针对java简单的可以理解为程序编译...
  • java动态绑定在属性和方法上的不同

    千次阅读 2016-05-09 16:06:37
    运行时绑定也叫动态绑定,它是一种调用对象方法的机制。Java调用对象方法时,一般采用运行时绑定机制。  1.Java的方法调用过程  编译器查看对象的声明类型和方法名(对象变量的声明类型)。通过声明类型找到...
  • 动态绑定意味着:目前正在调用的方法正是最适用于要操作对象的那个方法。然而它并不意味着对所有的参数都执行最佳匹配。 在Java中,一个方法的参数在编译阶段常被静态地绑定。 一个例子: class Base{ ...
  • 主要介绍了Java 静态绑定动态绑定深入分析的相关资料,这里对java动态绑定和静态绑定做了详细的介绍,对其进行总结整理,需要的朋友可以参考下
  • JAVA动态绑定

    万次阅读 2020-05-08 18:36:24
    JAVA动态绑定的调用过程 (1)编译器查看对象的声明类型与方法名字。并会一一列举 该类的所有的该名字的方法 (2) 编译器查看参数的类型,在找出来的方法中匹­配参数的类型与个数都相同的,该过程称为重载解析 (3...
  • Java静态绑定动态绑定的理解

    千次阅读 2018-01-16 12:48:34
    前言本人在学习虚拟机类加载机制时看到,java中类型的加载、连接和初始化过程都是在程序运行时期完成的。这种策略虽然会令类加载时稍微增加一些性能开销,但是会为java应用程序提供高度的灵活性...java绑定程序绑定的概
  • Java静态绑定动态绑定

    万次阅读 多人点赞 2014-04-19 00:31:12
    java来说,绑定分为静态绑定动态绑定;或者叫做前期绑定和后期绑定. 静态绑定: 在程序执行前方法已经被绑定(也就是说在编译过程中就已经知道这个方法到底是哪个类中的方法),此时由编译器或其它连接程序...
  • Java动态绑定和静态绑定

    千次阅读 多人点赞 2017-09-14 17:05:16
    Java来说,绑定分为静态绑定动态绑定;或者叫做前期绑定和后期绑定。静态绑定在程序执行前方法已经被绑定,此时由编译器或其它连接程序实现。例如:C。针对Java,可以简单地理解为程序编译期的绑定。这里特别...
  • java静态绑定&动态绑定详解

    千次阅读 2016-08-16 19:20:46
    程序绑定的概念: 绑定指的是一个方法的调用与方法所在的类(方法主体)关联起来。对java来说,绑定分为静态绑定和...这里特别说明一点,java当中的方法只有final,static,private和构造方法是前期绑定动态绑定: 后期
  • java来说,绑定分为前期绑定(静态绑定)与后期绑定动态绑定)。静态绑定: 在程序执行前方法已经被绑定(也就是说在编译过程中就已经知道这个方法到底是哪个类中的方法),此时由编译器或其它连接程序实现。 ...
  • java来说,绑定分为静态绑定动态绑定;或者叫做前期绑定和后期绑定。  静态绑定:  在程序执行前方法已经被绑定,此时由编译器或其它连接程序实现。例如:C。  针对java简单的可以理解为程序编译期的...
  • 主要帮助大家理解Java中的静态绑定动态绑定,在Java中存在两种绑定方式,一种为静态绑定,另一种就是动态绑定,亦称为后期绑定,感兴趣的小伙伴们可以参考一下
  • Java动态绑定

    千次阅读 2019-01-06 14:05:20
    所谓动态绑定,通俗的是指,对象在调用方法的时候能够自己判断该调用谁的方法。所以动态绑定一般发生在继承、方法重载时。  那么发生方法重载时,编译器如何确定调用的方法呢,例如,调用c.f(arg)时,首先需要将c...
  • 主要介绍了Java中的静态绑定动态绑定详细介绍,在Java中存在两种绑定方式,一种为静态绑定,又称作早期绑定,另一种就是动态绑定,亦称为后期绑定,需要的朋友可以参考下
  •  在Java中存在两种绑定方式,一种为静态绑定,又称作早期绑定。另一种是动态绑定,亦称为后期绑定。  区别对比  静态绑定发生在编译时期,动态绑定发生在运行时  使用private或static或final修饰的变量或者...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 538,030
精华内容 215,212
关键字:

java动态绑定

java 订阅