泛型 ,动态绑定,静态绑定

一、泛型  http://www.aqee.net/java-generics-quick-tutorial/

    简单点讲,泛型能节省某些java类型转换(casting)上的操作。泛型的主要好处就是让编译器保存参数的类型信息,执行类型检查,执行类型转换操作,编译器保证了这些类型转换的绝对无误。

    相对于程序员来记住对象类型执行类型转换(这可能会导致程序运行失败),而利用泛型,编译器能够帮助程序员在编译时强制进行大量的类型检查,发现其中的错误。

    在使用java泛型时,自动封转(Autoboxing)和自动拆装(Autounboxing)这两个特征会被自动用,而封装和解封装会带来性能上的损失。

 

二、动态绑定,静态绑定http://blog.sina.com.cn/s/blog_600046120100wdza.html

    程序绑定的概念:绑定指的是一个方法的调用与方法所在的(方法主题)关联起来。对java来说,绑定分为动态绑定和静态绑定,也叫做前期绑定和后期绑定。

    静态绑定:在程序执行前,方法已经被绑定,此时由编译器或其他链接程序实现。针对java简单的可以理解为程序编译器的绑定;这里特别说明一点,java当中的方法只有fanal,static,private和构造方法是前期绑定。

    动态绑定(后期绑定):在运行时根据具体对象的类型进行绑定,若有一种语言实现了后期绑定,同时必须提供一些机制,可在运行期间判断对象类型,并分别调用适当的方法。也就是说编译器此时依然不知道对象的类型,但方法调用机制能自己去调查,找到正确的方法主体。

    动态绑定的过程:虚拟机提取对象的实际类型的方法表,虚拟机搜索方法签名,调用方法。

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

   java中的向上转型或者说多态是借助于动态绑定实现的。

   比如:Parent p = new Children();其具体编译细节如下:

  1. 编译器检查对象的声明类型和方法名。假设我们调用x.f(args)方法,并且x已经被声明为C类的对象那么编译器会列举出C类众所的方法名为f的方法和从C类的超类继承过来的f方法。
  2. 接下来编译器检查方法调用中提供的参数类型。如果所有名称为f的方法中有一个参数类型和调用的方法的参数类型最为匹配,那么久调用这个方法,这个过程叫做“重载解析”。
  3. 当程序运行并且使用动态绑定调用方法时,虚拟机必须调用同x所指向的对象的实际类型所匹配的方法版本。假设实际类型为D(C的子类),如果D类定义了f,那么该方法被调用否则就在D的超类中搜寻方法f,以此类推。

注意,在处理java的成员变量时,并不是采用动态绑定,而是一般意义上的静态绑定。所以在向上转型的情况下,对象的方法可以找到子类,而对象的属性还是父类。
 

 

 

你可能感兴趣的:(泛型,动态绑定,静态绑定)