1:引言
这是在复习多态当中,看到不太理解的东西, 就是 Java编译类型和运行类型
2:多态
多态首先得是在 有继承关系和方法重写的类当中;指同一个方法在被调用时,由于对象不同则会有不同的效果()。
3:编译时类型和运行时类型
Java的引用变量有两个类型,一个是编译时类型,一个是运行时类型,编译时类型由声明该变量时使用的类型决定,运行时类型由实际赋给该变量的对象决定。
举例说明:
Person p=new Women()(Women类继承自Person类)那么,假如p的属性修饰符为public 访问属性时得到的是Person类的属性还是Women类的属性,方法调用又是哪个类?答案:会得到Person类的属性,调用Women类的方法。为什么会这样呢?这里就需要知道什么是编译时类型和运行时类型,Java程序状态会分为编译和运行这两种状态,编译时,JVM会在栈中静态创建基本数据变量,和引用数据变量的引用,回到刚刚那句代码,显然,p这个引用就是在编译时创建的,那么,p的编译时类型就是Person了,当运行这句java代码时,JVM在堆中为p新建一块内存,对应new Women()这句代码,所以p的运行时类型就是Women
所以 ,我们都知道在栈内存当中存放一些引用和变量,在堆内存中存放对象。编译时期可以理解为堆内存中还没有为该对象创建内存,只是在栈中创建了一些基本类型的变量和引用,所以编译时类型就是指在new该对象之前被加载到栈中的属性或方法。而运行时类型,是指new了一个对象出来,在栈中为该对象分配了内存,此时的运行时类型也就是栈中对象的属性或方法了。
4:对象的转型
父类引用指向 子类对象,我们称之为 向上转型 属于自动类型转换
向上转型后父类 引用变量只能调用它 编译类型的方法 不能调用运行时的类型方法,(即调用父类当中的方法)
如果想要调用运行时的类型和方法 则可以 强制向下转型(即调用子类的方法)