Java 动态绑定 静态绑定

绑定的概念:

绑定指的是一个方法的调用与方法所在的类(方法主体)关联起来。对java来说,绑定分为静态绑定和动态绑定,或者叫做前期绑定和后期绑定。



静态绑定:

在程序执行前方法已经被绑定,此时由编译器或其它连接程序实现。

针对java简单的可以理解为程序编译期的绑定,这里特别说明一点,java当中的方法只有final,static,private和构造方法是前期绑定


动态绑定:

在运行时根据具体对象的类型进行绑定。

若一种语言实现了动态绑定,同时必须提供一些机制,可在运行期间判断对象的类型,并分别调用适当的方法。也就是说,编译器此时依然不知道对象的类型,但方法调用机制能自己去调查,找到正确的方法主体。不同的语言对后期绑定的实现方法是有所区别的。但我们至少可以这样认为:它们都要在对象中安插某些特殊类型的信息。


Java动态绑定的过程:

  • 编译器查看对象的声明类型和方法名。假设调用x.f(param),且隐式参数x声明为C类的对象。编译器将会一一列举所有C类中名为f的方法和其父类中访问属性为public且名为f的方法。

至此,编译器已获得所有可能被调用的候选方法。

  • 接下来,编译器将查看调用方法时提供的参数类型。如果在所有名为f的方法中存在一个与提供的参数类型完全匹配,就选择这个方法。这个过程被称为重载解析( overloadingresolution)。如果编译器没有找到与参数类型匹配的方法,或者发现经过类型转换后有多个方法与之匹配,就会报告一个错误。

至此,编译器已获得需要调用的方法名字和参数类型。

  • 如果是private方法、 static方法、 final方法或者构造器,那么编译器将可以准确地知道应该调用哪个方法,我们将这种调用方式称为静态绑定( static binding)。与此对应的是,调用的方法依赖于隐式参数的实际类型,并且在运行时实现动态绑定。
  • 当程序运行,并且采用动态绑定调用方法时,虚拟机一定调用与x所引用对象的实际类型最合适的那个类的方法。假设x 的实际类型是D,它是C类的子类。如果D类定义了方法f(String),就直接调用它;否则,将在D类的超类中寻找f(String),以此类推。

总结:

在Java中,几乎所有的方法都是动态绑定的,在运行时动态绑定方法属于子类还是父类。但是也有特殊,针对static方法和final方法由于不能被继承,因此在编译时就可以确定他们的值,他们是属于静态绑定的。特别说明的一点是,private声明的方法和成员变量不能被子类继承,所有的private方法都被隐式的指定为final的(由此我们也可以知道:将方法声明为final类型的一是为了防止方法被覆盖,二是为了有效的关闭Java中的动态绑定)。

时间: 2024-08-11 03:28:57

Java 动态绑定 静态绑定的相关文章

java 动态绑定

之前看数据结构事经常会遇到:List list = new LinkedList()这样的向上转型,就研究了一下向上转型(之前只知道怎么用向上转型,但是不知道为什么向上转型,在我另外一篇博客里介绍http://www.cnblogs.com/buptldf/p/4959480.html 其中又看到关于动态绑定的概念,所以又专门看了一下. 程序绑定:调用方法时方法名与方法实体关联的过程.对于java有静态绑定和动态绑定,也有说前期和后期绑定的. 静态绑定: 在程序编译时就被绑定且被加载进内存等待被

Java基础 之Java动态绑定详解

程序绑定的概念: 绑定指的是一个方法的调用与方法所在的类(方法主体)关联起来.对java来说,绑定分为静态绑定和动态绑定:或者叫做前期绑定和后期绑定 静态绑定(早绑定 编译器绑定): 在程序执行前方法已经被绑定,此时由编译器或其它连接程序实现.例如:C. 针对java简单的可以理解为程序编译期的绑定:这里特别说明一点,java当中的方法只有final,static,private和构造方法是前期绑定 动态绑定(迟绑定 运行期绑定): 后期绑定:在运行时根据具体对象的类型进行绑定. 若一种语言实现

Java动态绑定机制的内幕解惑

在Java方法调用的过程中,JVM是如何知道调用的是哪个类的方法源代码? 这里面到底有什么内幕呢? 这篇文章我们就将揭露JVM方法调用的静态(static binding)和动态绑定机制(auto binding). ★ 静态绑定机制 Java代码   //被调用的类 package hr.test; class Father{ public static void f1(){ System.out.println("Father- f1()"); } } //调用静态方法 impor

【解惑】Java动态绑定机制的内幕

在Java方法调用的过程中,JVM是如何知道调用的是哪个类的方法源代码? 这里面到底有什么内幕呢? 这篇文章我们就将揭露JVM方法调用的静态(static binding) 和动态绑定机制(auto binding) . ★ 静态绑定机制 //被调用的类 package hr.test; class Father{ public static void f1(){ System.out.println("Father— f1()"); } } //调用静态方法 import hr.te

Java——动态绑定和多态

动态绑定是在执行期间(而不是编译期间)判断所用对象的实际类型,根据其实际的类型调用其相应的方法(确定选择哪个多态形式被调用). 首先是方法的参数是父类对象,传入子类对象是否可行 然后引出Parent p = new Children(); 这句代码不是很理解,google的过程中引出向上转型 要理解向上转型又引出了动态绑定 从动态绑定又引出了静态绑定   程序绑定的概念: 绑定指的是一个方法的调用与方法所在的类(方法主体)关联起来.对java来说,绑定分为静态绑定和动态绑定:或者叫做前期绑定和后

JAVA动态绑定的内部实现机制

转载:http://blog.csdn.net/sureyonder/article/details/5569617 JAVA虚拟机调用一个类方法时,它会基于对象引用的类型(通常在编译时可知)来选择所调用的方法.相反,当虚拟机调用一个实例方法时,它会基于对象实际的类型(只能在运行时得知)来选择所调用的方法,这就是动态绑定,是多态的一种.动态绑定为解决实际的业务问题提供了很大的灵活性,是一种非常优美的机制. 1 JAVA对象模型 JAVA虚拟机规范并没有规定JAVA对象在堆里是如何表示的.对象的内

从stackoverflow上的一个问题看Java动态绑定

我们先来看stackoverflow上的一个问题,先上代码 1 public class Piece{ 2 public static void main (String [] args){ 3 Piece p2 = new Knight(); 4 Knight p1 = new Knight(); 5 p1.capture(p2); 6 p2.capture(p1); 7 } 8 public void capture(){ 9 System.out.println("Capture"

Java动态绑定

1. 动态绑定 将一个方法调用同一个方法主体关联起来被称作绑定. 在运行时根据对象的类型进行绑定,叫做后期绑定或运行时绑定.Java中除了static方法和final 例如,下面定义了一个Shape类型的变量,这是个Shape引用,由于后期绑定,赋予其子类Circle的一个对象引用,最终调用的是Circle.draw()方法. 1 package com.khlin.binding.test; 2 3 public class App { 4 public static void main(St

Java动态绑定与多态

在面向对象的程序设计语言中,多态是继数据抽象和继承之后的第三种基本特性.多态通过分离做什么和怎么做,从另一个角度将接口和实现分离开来.在一开始接触多态这个词的时候,我们或许会因为这个词本身而感到困惑,如果我们把多态改称作"动态绑定",相信很多人就能理解他的深层含义.通常的,我们把动态绑定也叫做后期绑定,运行时绑定. (一)方法调用绑定 1.绑定概念 通常,我们将一个方法调用同一个方法主体关联起来称作绑定.如果在程序执行前进行绑定,我们将这种绑定方法称作前期绑定.在面向过程语言中,比如c