个人博客地址:https://blog.csdn.net/qq_41907991
关于java运行时及编译时期的区别:
首先我们要了解编译以及运行的概念:
编译就是指,编译器帮你把源码翻译成机器能识别的字节码,编译时主要做的事情时检查语法以及优化代码
运行就是指,代码被加载到内存中,并开始跑起来
从以下代码开始说明,欢迎大家指正
public class Test{
static final int a=10;
static final int b=20;
static int c=10;
static int d=20;
public static void main(String[] args){
int num1=a*b; // 第一行
int num2=c*d; //第二行
}
}
可以思考下,第一行跟第二行在编译时期有什么区别?
java编译时会做一些优化操作。第一行,因为是两个常量做运算,那么他们的结果就是确定的,即num1的值是确定的。
所以在编译时,编译器就会直接算出num1的值。第二行则不会,java在运行时期才为变量分配内存空间。
所以反编译后可以得到如下代码:
public static void main (String [] args){
int num1=200;
int num2=c*d;
}
由此,可以证码以上结论。
泛型,重写,重载分别时在运行时还是在编译时期执行?
1.我们知道,泛型的类型检测发生在编译时期,这也正是泛型的好处之一,可以提前暴露问题,而不是等到运行时出现ClassCastException。另外,在检测后编译器会把它重写成实际的对象类型(非泛型类型),这样就可以被JVM执行了,这个过程被称为泛型的擦除。
泛型的擦除关键在于从泛型类型中清楚泛型参数的相关信息,再在必要时添加类型转换和类型检查的方法(例如调用某个泛型方法时,就会执行类型检测)。
泛型的擦除可以简单理解为,将泛型类型java代码转换成为普通代码。泛型擦除的主要过程如下:
1).将所有泛型参数用最左边界(最顶级的父类型)的的类型替换
2).移除所有类型参数
2.方法的重载,重载时在编译时期执行,因为在编译时期如果发生了方法的重载,那么在编译时必须明确具体方法是哪一个
3.方法的重写,重写发生在运行时期。编译时期只会检测父类中是否存在重写的方法,但是并不能明确具体子类的方法。只有在运行时,才知道父子类中到底哪个方法被调用了。这个也被称为运行时多态的体现