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

             

  • 相关阅读:
    20000字干货笔记,一天搞定Mysql~【转】
    Linux操作系统概述及内核介绍
    如何在装有高版本NBU的主机上安装低版本的NBU?卸载8.0安装7.5记录
    vmware+kvm+vnc安装配置
    NBU异机恢复Oracle数据库,作业报错2850处理
    NetBackup 进程整理
    1、虚拟化实施流程、宿主机如何选型、如何进行性能测试
    灾难恢复的衡量指标RTO和RPO
    国内主要灾备厂商
    单例设计模式
  • 原文地址:https://www.cnblogs.com/daimzh/p/12854521.html
Copyright © 2011-2022 走看看