带有编译时和运行时的简记

编译时类型和运行时类型

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了一个对象出来,在堆中为该对象分配了内存,此时的运行时类型也就是堆中对象的属性或方法了。)


编译时异常和运行时异常

  编译时异常需要我们手动的进行捕捉处理,即我们用try...catch块进行捕捉处理。举例子说就是想找你的文件,数据进行编译都找不到,不主动捕捉就发现不了,一直似死机状态。如:FileNotFoundException。

  运行时异常只有在编译运行时才会出现,不需要我们手动处理,如:NullPointerException(空指针异常)、ClassCastException(类型转换异常)、IndexOutOfBoundsException(数组下标越界异常)换句话说就是程序可以编译,只是输出的时候发生异常。

原文地址:https://www.cnblogs.com/yangrongkuan/p/11996440.html