java 动态绑定

之前看数据结构事经常会遇到:List list = new LinkedList()这样的向上转型,就研究了一下向上转型(之前只知道怎么用向上转型,但是不知道为什么向上转型,在我另外一篇博客里介绍http://www.cnblogs.com/buptldf/p/4959480.html  

其中又看到关于动态绑定的概念,所以又专门看了一下。

程序绑定:调用方法时方法名与方法实体关联的过程。对于java有静态绑定和动态绑定,也有说前期和后期绑定的。

静态绑定:

        在程序编译时就被绑定且被加载进内存等待被调用,由编译器和它链接的程序实现,C语言就是静态绑定。java中变量或者说属性都是静态绑定的,所有的static,final,private方法修饰的方法也是静态绑定的。

动态绑定:

         在程序运行时根据具体对象绑定,编译时不做处理。若一种语言实现了后期绑定,同时必须提供一些机制,可在运行期间判断对象的类型,并分别调用适当的方法。也就是说,编译器此时依然不知道对象的类型,但方 法调用机制能自己去调查,找到正确的方法主体。不同的语言对后期绑定的实现方法是有所区别的。但我们至少可以这样认为:它们都要在对象中安插某些特殊类型 的信息。动态绑定的过程:1.虚拟机提取对象的实际类型的方法表;2.虚拟机搜索方法签名;3调用方法。细节查看http://blog.csdn.net/sureyonder/article/details/5569617

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

         主要用于向上转型。比如:Father f = new Son();

          1.编译器检查对象的声明类型和方法名,如果调用f.speak(args),编译器会找到所有Son类的名字为method的方法及从Father类继承的名字为speak的方法,得到一个speak方法的列表。

           2.然后检查speak方法的参数,如果对象f找到调用的speak方法和第一步找到的方法列表中某一个方法最为匹配,则调用方法列表中这个方法所指向的方法体(就是具体方法所作的事情),这个过程叫做“重载解析”。

            3:如果找到的方法列表里有两个匹配的方法,一个是父类的,一个是子类重写过的,则编译器会去调用重写过的方法。如果子类对象调用一个方法,这个方法自己没有,就会去它的父类中去找,其实调用的时候第二步就会只能找到一个与调用方法匹配的方法,即父类的方法。

          多说无意,看例子:

Java代码 


view plaincopy to clipboardprint? 
public class Father {   
  public void method() {   
    System.out.println("父类方法,对象类型:" + this.getClass());   
  }   
}   
     
public class Son extends Father {   
  public static void main(String[] args) {   
    Father sample = new Son();//向上转型   
    sample.method();   
  }   
}   

声明的是父类的引用,但是执行的过程中调用的是子类的对象,程序首先寻找子类对象的method方法,但是没有找到,于是向上转型去父类寻找

public class Son extends Father { 

  
  public void method() {   
    System.out.println("子类方法,对象类型:" + this.getClass());   
  }   
     
  public static void main(String[] args) {   
    Father sample = new Son();//向上转型   
    sample.method();   
  }   

由于子类重写了父类的method方法,根据上面的理论知道会去调用子类的method方法去执行,因为子类对象有method方法而没有向上转型去寻找

 

 

 

 

     

 

posted on 2015-11-12 20:06  slower  阅读(673)  评论(0编辑  收藏  举报