java编译时与运行时概念与实例详解
发布时间 - 2026-01-11 00:44:05 点击率:次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编译时类型与运行时类型
# 抛出
# 被称为
# 都是
# 是在
# 子类
# 会在
# 列子
# 时就
# 时计
# 做些
# 翻译成
# 擦除
# 是个
# 如果你
# 发生在
# 还没
# 多态
# 去了
# 你可以
# 不需要
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
使用C语言编写圣诞表白程序
C#如何调用原生C++ COM对象详解
EditPlus中的正则表达式 实战(4)
如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?
如何在建站之星绑定自定义域名?
无锡营销型网站制作公司,无锡网选车牌流程?
Mybatis 中的insertOrUpdate操作
如何破解联通资金短缺导致的基站建设难题?
为什么php本地部署后css不生效_静态资源加载失败修复技巧【技巧】
android nfc常用标签读取总结
Laravel如何升级到最新版本?(升级指南和步骤)
Laravel如何监控和管理失败的队列任务_Laravel失败任务处理与监控
JavaScript中的标签模板是什么_它如何扩展字符串功能
详解jQuery停止动画——stop()方法的使用
Laravel如何实现文件上传和存储?(本地与S3配置)
Laravel如何与Inertia.js和Vue/React构建现代单页应用
如何在服务器上三步完成建站并提升流量?
Laravel如何与Pusher实现实时通信?(WebSocket示例)
Win11怎么修改DNS服务器 Win11设置DNS加速网络【指南】
英语简历制作免费网站推荐,如何将简历翻译成英文?
javascript日期怎么处理_如何格式化输出
Laravel怎么处理异常_Laravel自定义异常处理与错误页面教程
如何在VPS电脑上快速搭建网站?
高防网站服务器:DDoS防御与BGP线路的AI智能防护方案
Bootstrap整体框架之CSS12栅格系统
html5如何实现懒加载图片_ intersectionobserver api用法【教程】
电视网站制作tvbox接口,云海电视怎样自定义添加电视源?
Javascript中的事件循环是如何工作的_如何利用Javascript事件循环优化异步代码?
Linux系统运维自动化项目教程_Ansible批量管理实战
如何快速配置高效服务器建站软件?
如何在IIS中配置站点IP、端口及主机头?
悟空浏览器如何设置小说背景色_悟空浏览器背景色设置【方法】
Laravel中间件如何使用_Laravel自定义中间件实现权限控制
如何快速生成专业多端适配建站电话?
如何快速搭建高效服务器建站系统?
美食网站链接制作教程视频,哪个教做美食的网站比较专业点?
如何快速选择适合个人网站的云服务器配置?
浅谈Javascript中的Label语句
Laravel如何使用软删除(Soft Deletes)功能_Eloquent软删除与数据恢复方法
海南网站制作公司有哪些,海口网是哪家的?
LinuxShell函数封装方法_脚本复用设计思路【教程】
如何在宝塔面板中修改默认建站目录?
Laravel的契約(Contracts)是什么_深入理解Laravel Contracts与依赖倒置
中山网站制作网页,中山新生登记系统登记流程?
网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?
如何在腾讯云免费申请建站?
JavaScript如何实现音频处理_Web Audio API如何工作?
C++时间戳转换成日期时间的步骤和示例代码
儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?
北京专业网站制作设计师招聘,北京白云观官方网站?

