全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

java编译时与运行时概念与实例详解

Java编译时与运行时很重要的概念,但是一直没有明晰,这次专门博客写明白概念.

基础概念

编译时

编译时顾名思义就是正在编译的时候.那啥叫编译呢?就是编译器帮你把源代码翻译成机器能识别的代码.(当然只是一般意义上这么说,实际上可能只是翻译成某个中间状态的语言.比如Java只有JVM识别的字节码,.另外还有啥链接器.汇编器.为了了便于理解我们可以统称为编译器)

那编译时就是简单的作一些翻译工作,比如检查老兄你有没有粗心写错啥关键字了啊.有啥词法分析,语法分析之类的过程.就像个老师检查学生的作文中有没有错别字和病句一样.如果发现啥错误编译器就告诉你.所以有时一些人说编译时还分配内存啥的肯定是错误的说法.

运行时

所谓运行时就是代码跑起来了.被装载到内存中去了.(你的代码保存在磁盘上没装入内存之前是个死家伙.只有跑到内存中才变成活的).而运行时类型检查就与前面讲的编译时类型检查(或者静态类型检查)不一样.不是简单的扫描代码.而是在内存中做些操作,做些判断.(这样很多编译时无法发现的错误,在运行就可以发现报错了,最好还是写的的时候就避免这个逻辑错误就好了)

举列子

int arr[] = {1,2,3}; 
int result = arr[4]; 
System.out.println(result); 
Exception in thread “main” java.lang.ArrayIndexOutOfBoundsException: 4 

上面的代码你一瞧你知道是错误的代码,数组越界了.但用编译器没有报错,run后才出现了ArrayIndexOutOfBoundsException.可见编译器其实还是挺笨的,还没你脑瓜子那么聪明啊,于是你想虽然编译器笨了点,但运行起来时发现了错误也还不算太坏.

面试题

理解这几个概念可以更好地帮助你去了解一些基本的原理。下面是初学者晋级中级水平需要知道的一些问题。 
Q.下面的代码片段中,行A和行B所标识的代码有什么区别呢?

public class ConstantFolding {

 static final int number1 = 5;

 static final int number2 = 6;

 static int number3 = 5;

 static int number4= 6;

 public static void main(String[ ] args) {

 int product1 = number1 * number2; //line A

 int product2 = number3 * number4; //line B

 }

}
                                                                                                                                                                            

A.在行A的代码中,product的值是在编译期计算的,行B则是在运行时计算的。如果你使用Java反编译器(例如,jd-gui)来反编译ConstantFolding.class文件的话,那么你就会从下面的结果里得到答案。

public class ConstantFolding
{
 static final int number1 = 5;
 static final int number2 = 6;
 static int number3 = 5;
 static int number4 = 6;

 public static void main(String[ ] args)
 {
 int product1 = 30;
 int product2 = number3 * number4;
 }
}

常量折叠是种Java编译器使用的优化技术。由于final变量的值不会改变,因此就可以对它们优化。Java反编译器和javap命令都是查看编译后的代码(例如,字节码)的利器。

方法重载:这个是发生在编译时的。方法重载也被称为编译时多态,因为编译器可以根据参数的类型来选择使用哪个方法。

public class {
 public static void evaluate(String param1); // method #1
 public static void evaluate(int param1); // method #2
}

如果编译器要编译下面的语句的话:

1evaluate(“My Test Argument passed to param1”);

它会根据传入的参数是字符串常量,生成调用#1方法的字节码

方法覆盖:这个是在运行时发生的。方法重载被称为运行时多态,因为在编译期编译器不知道并且没法知道该去调用哪个方法。JVM会在代码运行的时候做出决定。

public class A {
 public int compute(int input) { //method #3
 return 3 * input;
 } 
}

public class B extends A {
 @Override
 public int compute(int input) { //method #4
 return 4 * input;
 } 
}

子类B中的compute(..)方法重写了父类的compute(..)方法。如果编译器遇到下面的代码:

public int evaluate(A reference, int arg2) {
 int result = reference.compute(arg2);
}

编译器是没法知道传入的参数reference的类型是A还是B。因此,只能够在运行时,根据赋给输入变量“reference”的对象的类型(例如,A或者B的实例)来决定调用方法#3还是方法#4

泛型(又称类型检验):这个是发生在编译期的。编译器负责检查程序中类型的正确性,然后把使用了泛型的代码翻译或者重写成可以执行在当前JVM上的非泛型代码。这个技术被称为“类型擦除“。

换句话来说,编译器会擦除所有在尖括号里的类型信息,来保证和版本1.4.0或者更早版本的JRE的兼容性。

1List myList = new ArrayList(10);

编译后成为了:

1List myList = new ArrayList(10);

异常(Exception):你可以使用运行时异常或者编译时异常。

运行时异常(RuntimeException)也称作未检测的异常(unchecked exception),这表示这种异常不需要编译器来检测。

RuntimeException是所有可以在运行时抛出的异常的父类。一个方法除要捕获异常外,如果它执行的时候可能会抛出

RuntimeException的子类,那么它就不需要用throw语句来声明抛出的异常。

例如:NullPointerException,ArrayIndexOutOfBoundsException,等等

受检查异常(checked exception)都是编译器在编译时进行校验的,通过throws语句或者try{}cathch{} 语句块来处理检测异常。编译器会分析哪些异常会在执行一个方法或者构造函数的时候抛出。

希望本篇文章对您有所帮助


# java编译时与运行时  # java编译时  # java运行时  # Java注解处理器学习之编译时处理的注解详析  # AndroidApk混淆编译时  # 报告java.io.IOException...错误解决办法  # java编译时出现使用了未经检查或不安全的操作解决方法  # Java虚拟机运行时栈的栈帧  # java学习之JVM运行时常量池理解  # java应用开发之JVM运行时内存分析  # Java编译时类型与运行时类型  # 抛出  # 被称为  # 都是  # 是在  # 子类  # 会在  # 列子  # 时就  # 时计  # 做些  # 翻译成  # 擦除  # 是个  # 如果你  # 发生在  # 还没  # 多态  # 去了  # 你可以  # 不需要 


相关文章: Android自定义listview布局实现上拉加载下拉刷新功能  如何快速上传建站程序避免常见错误?  网站制作说明怎么写,简述网页设计的流程并说明原因?  网站制作的软件有哪些,制作微信公众号除了秀米还有哪些比较好用的平台?  制作网站哪家好,cc、.co、.cm哪个域名更适合做网站?  如何通过PHP快速构建高效问答网站功能?  C++ static_cast和dynamic_cast区别_C++静态转换与动态类型安全转换  胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?  免费ppt制作网站,有没有值得推荐的免费PPT网站?  魔方云NAT建站如何实现端口转发?  佛山企业网站制作公司有哪些,沟通100网上服务官网?  如何快速搭建个人网站并优化SEO?  西安制作网站公司有哪些,西安货运司机用的最多的app或者网站是什么?  青浦网站制作公司有哪些,苹果官网发货地是哪里?  如何在阿里云部署织梦网站?  如何在腾讯云服务器上快速搭建个人网站?  如何用花生壳三步快速搭建专属网站?  c# 在ASP.NET Core中管理和取消后台任务  南京做网站制作公司,南京哈发网络有限公司,公司怎么样,做网页美工DIV+CSS待遇怎么样?  在线制作视频的网站有哪些,电脑如何制作视频短片?  公司网站建设制作费用,想建设一个属于自己的企业网站,该如何去做?  如何使用Golang安装API文档生成工具_快速生成接口文档  如何确保西部建站助手FTP传输的安全性?  如何用狗爹虚拟主机快速搭建网站?  建站上传速度慢?如何优化加速网站加载效率?  如何在香港服务器上快速搭建免备案网站?  香港服务器网站推广:SEO优化与外贸独立站搭建策略  专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?  创业网站制作流程,创业网站可靠吗?  台州网站建设制作公司,浙江手机无犯罪记录证明怎么开?  微网站制作教程,不会写代码,不会编程,怎么样建自己的网站?  临沂网站制作企业,临沂第三中学官方网站?  深圳防火门网站制作公司,深圳中天明防火门怎么编码?  制作充值网站的软件,做人力招聘为什么要自己交端口钱?  如何基于云服务器快速搭建个人网站?  如何在IIS中新建站点并配置端口与物理路径?  建站之星导航配置指南:自助建站与SEO优化全解析  网页设计与网站制作内容,怎样注册网站?  网站规划与制作是什么,电子商务网站系统规划的内容及步骤是什么?  动图在线制作网站有哪些,滑动动图图集怎么做?  头像制作网站在线制作软件,dw网页背景图像怎么设置?  再谈Python中的字符串与字符编码(推荐)  建站OpenVZ教程与优化策略:配置指南与性能提升  网站制作免费,什么网站能看正片电影?  Bpmn 2.0的XML文件怎么画流程图  公司网站制作价格怎么算,公司办个官网需要多少钱?  新网站制作渠道有哪些,跪求一个无线渠道比较强的小说网站,我要发表小说?  移民网站制作流程,怎么看加拿大移民官网?  建站之星多图banner生成与模板自定义指南  常州企业建站如何选择最佳模板? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。