关于多态的编译时类型和运行时类型了解

多态的编译时类型和运行时类型

多态中的成员访问特点

  • 成员变量

    ​ 编译看父类,运行看父类

  • 成员方法

    ​ 编译看父类,运行看子类
    对于其中的编译和运行时期类型不是很理解,看了这篇文章有了了解编译时期和运行时期的区别.
    编译时期可以理解为堆内存中还没有为该对象创建内存,只是在栈中创建了一些基本类型的变量和引用,所以编译时类型就是指在new该对象之前被加载到栈中的属性或方法。而运行时类型,是指new了一个对象出来,在栈中为该对象分配了内存,此时的运行时类型也就是栈中对象的属性或方法了。
    Person person = new student();

这里就可以很好地理解编译时类型和运行时类型了。
编译时类型是Person,当new了一个对象之后,堆内存中产生了一个Student对象,此时的类型就是运行时类型,也就是Student类型了。

这里需要补充的是,在多态中,将子类对象赋给父类的引用,会产生多态。
Father son = new Son();
需要注意的是多态对象不能引用父类没有的子类方法