Java动态绑定

来源:互联网 发布:智能手机反黄软件 编辑:程序博客网 时间:2024/06/01 08:15

问题引入

package javabasis.OO;/** * Created by admin on 2017/2/14. */public class DongTaiBangDing {    public static void main(String[] args) {        getInfo(new SeniorSon());        getInfo(new JuniorSon());    }    public static void getInfo(Father father){        System.out.println("调用的属性:" + father.name);        System.out.print("调用的方法:" );        father.speak();    }}class Father {    protected String name = "父亲属性";    protected void speak(){        System.out.println("父亲的方法");    }}class SeniorSon extends Father {    protected String name = "大儿子属性";    protected void speak() {        System.out.println("大儿子的方法");    }}class JuniorSon extends Father {    protected String name = "小儿子属性";    protected void speak() {        System.out.println("小儿子的方法");    }}
输出结果:

调用的属性:父亲属性
调用的方法:大儿子的方法
调用的属性:父亲属性
调用的方法:小儿子的方法

在getInfo()方法中,形参的是父类对象Father,在调用过程中,传入的实参分别是两个继承父类对象的子类对象,编译器是如何得知具体引用哪个对象的?

在输出结果中,为什么属性总是父类的属性,却调用了子类的方法?

Java的绑定机制

绑定指的是一个方法的调用与方法所在的类(方法主体)关联起来。对Java来说,绑定分为静态绑定和动态绑定;或者叫做前期绑定和后期绑定.
静态绑定:在程序执行前方法已经被绑定(也就是说在编译过程中就已经知道这个方法到底是哪个类中的方法),此时由编译器或其它连接程序实现。针对java简单的可以理解为程序编译期的绑定;这里特别说明一点,java当中的方法只有final,static,private和构造方法是前期绑定

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

一旦知道Java中所有方法都是通过动态绑定实现多态这个机制后,我们就可以编写至于基类(父类)打交道的代码了。
 与方法不同,在处理java类中的成员变量(包括实例变量和类变量)时,并不是采用运行时绑定,而是一般意义上的静态绑定。所以在向上转型的情况下,对象的方法可以找到子类,而对象的属性还是父类的属性。
因此在编程中,我们一般会通过getter方法访问子类的成语变量。




0 0