编译时类型,运行时类型与动态绑定机制

51 阅读1分钟

引用变量在编译阶段只能调用其编译时类型所具有的方法,但运行时则执行它运行时类型所重写的方法

   例如:  Father是父类,Son是子类
           Father fa = new Son()  

左边是父类也是编译时类型,右边是子类也是运行时类型(向上转型),在编译时只能调用父类中具有的方法,如果子类重写了该方法,运行时实际调用的是运行时类型的该方法。这是多态实现的原理之一。

(与方法不同的是,对象的属性则不具备多态性。通过引用变量来访问其包含的实例属性时,系统总是试图访问它编译时类所定义的属性,而不是它运行时所定义的属性。)

向上转型之后无法使用子类自己的方法,想要使用得向下转型回来:Son so =(Son)fa

动态绑定机制

1.当调用对象方法的时候,该方法会和该对象的内存地址/运行类型绑定。

2.当调用对象属性时,没有动态绑定机制,哪里声明哪里使用。

例如:

   class AA{                           
   int i = 10;
   public int getI(){
        return i;
   }
   public int sum(){
        return getI() + 10;
   }
   }


   class BB extends AA{                           
   int i = 20;
   
   public int getI(){
        return i+20;
   }
   }
public class test{    
    public static void main(String[] args) {
        AA aa = new BB();
        System.out.println(aa.sum())
    }

}

在这个案例中aa.sum()最后返回的值是50。

由此可知在调用对象时会遵循动态绑定机制,先查找自己有没有这个方法,如果没有会遵循继承规则从父类中查找该方法。