关于编译类型与运行类型以及动态绑定

Java的引用变量有两个类型,一个是编译时类型,一个是运行时类型,编译时类型由声明该变量时使用的类型决定,运行时类型由实际赋给该变量的对象决定。

——完全听不懂的原则

所谓的编译类型和运行类型这两个概念针对的是对象多态的使用情况。

举个例子:


/**
 * Demo
 */
public class Demo {

  public static void main(String[] args) {
    Sub sub = new Sub();
    System.out.println(sub.count);//20
    sub.printCount();//20
    Base base       =       sub;
    //属于运行类型           属于运行类型
    System.out.println(base == sub);//ture
    System.out.println(base.count);//10
    base.printCount();//20
  }
}

class Base {
  int count = 10;

  public void printCount() {
    System.out.println(this.count);
  }
}

class Sub extends Base {
  int count = 20;

  public void printCount() {
    System.out.println(this.count);
  }
}

有同学就会问了,为啥对sub进行向上转型之后,调用属性和方法的结果竟然不同,其实原因就是在一个引用指向一个新创建的对象时,引用所使用的类算作编译类型,引用所指向的对象都算作运行类型;当发生向上转型后,引用部分和引用所指向的对象二者不同(Base和Sub),所以调用属性,输出的是引用本身的对象即编译类型(Base)的属性;调用方法时,输出的是引用所指向的对象即运行类型的属性(Sub)。

动态绑定机制是两条原则:

  1. 调用对象的方法时,该方法会和所调用的对象(base)的运行类型(sub)绑定;
  2. 调用对象的属性时,不存在动态绑定机制
posted @ 2022-07-28 18:11  Kisen  阅读(145)  评论(0)    收藏  举报