java运行时跟编译时的区别,欢迎大家指正

个人博客地址: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.方法的重写,重写发生在运行时期。编译时期只会检测父类中是否存在重写的方法,但是并不能明确具体子类的方法。只有在运行时,才知道父子类中到底哪个方法被调用了。这个也被称为运行时多态的体现

         

原文地址:https://www.cnblogs.com/daimzh/p/12854521.html