zoukankan      html  css  js  c++  java
  • 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方法而没有向上转型去寻找

         

  • 相关阅读:
    已解决[Authentication failed for token submission,Illegal hexadecimal charcter s at index 1]
    远程快速安装redis和远程连接
    远程快速安装mysql
    Swiper的jquery动态渲染不能滑动
    微服务架构攀登之路(三)之gRPC入门
    微服务架构攀登之路(二)之RPC
    微服务架构攀登之路(一)之微服务初识
    Go语言中new和make的区别
    Go语言实战爬虫项目
    Go语言系列(十一)- 日志收集系统架构
  • 原文地址:https://www.cnblogs.com/buptldf/p/4960131.html
Copyright © 2011-2022 走看看