讲师中心 微信公众号
AI工具推荐 视频效率加速

在Java里编译期和运行期有什么区别_Java程序生命周期解析

千枫大大_8649

千枫大大_8649

发布时间:2026-01-29 02:09:08

|

1053人浏览过

|

来源于php中文网

原创

编译期仅做语法和类型检查,不执行代码;运行期才加载类、分配内存、触发初始化;编译期常量需满足final+字面量+基本类型或String;反射和动态代理绕过编译检查。

在java里编译期和运行期有什么区别_java程序生命周期解析

编译期只做语法和类型检查,不执行任何代码

Java源文件(.java)被javac处理时,编译器只验证语法规则、符号存在性、泛型擦除后类型兼容性等。它不会调用main方法,也不会初始化静态变量或执行static块——哪怕里面写了System.out.println("hello"),编译期也完全无视。

常见误判场景:

  • 把NullPointerException当成编译错误(实际是运行期才抛)
  • 以为final int x = getValue();中getValue()会在编译期求值(不会,除非是常量表达式)
  • 对String s = "a" + "b";能优化成"ab"有印象,但误以为所有字符串拼接都这样(仅限编译期可知的字面量)

运行期才真正加载类、分配内存、触发初始化

当java命令启动JVM后,类加载器按需读取.class字节码,链接(验证、准备、解析),再执行<clinit></clinit>(静态初始化块和静态字段赋值)。此时new对象、调用方法、访问数组下标越界等行为才会真实发生。

关键差异点:

立即学习“Java免费学习笔记(深入)”;

  • Class.forName("X")会触发初始化;ClassLoader.loadClass("X")默认不触发
  • int[] arr = new int[10];在运行期才向堆申请内存,编译期只检查语法合法
  • 泛型信息在运行期已擦除,List<string></string>和List<integer></integer>在JVM里都是List

编译期常量和运行期常量容易混淆

只有满足“编译期可知+基本类型或String+用final修饰+直接赋字面量值”的变量,才是编译期常量。例如:

WebChat Voice Proxy
WebChat Voice Proxy

⚠️ 已弃用 — 该技能已拆分为两个独立技能,以提升模块化程度:**webchat-https-proxy**(HTTPS/WSS 反向代理)和 **webchat-voi...**

下载
final int A = 10;                    // ✅ 编译期常量
final String B = "hello";            // ✅ 编译期常量
final int C = System.currentTimeMillis(); // ❌ 运行期才确定
final int D = getConst();            // ❌ 方法调用无法在编译期求值

这种区别直接影响:

  • 是否参与switch语句的case分支(必须是编译期常量)
  • 是否被内联到调用处(如public static final int MAX = 100;会被替换成100)
  • 是否允许在注解中作为属性值(同样要求编译期常量)

反射和动态代理彻底打破编译期约束

编译期检查不到的类型关系,在运行期可能通过反射绕过。比如:

Object obj = "hello";
Method m = obj.getClass().getMethod("length");
int len = (int) m.invoke(obj); // 编译期不知道obj有length(),但运行期可以调

这类操作代价高,且绕过了编译器保护:

  • 方法名写错 → 运行时报NoSuchMethodException
  • 参数类型不匹配 → 运行时报IllegalArgumentException
  • 私有成员访问未设setAccessible(true) → 运行时报IllegalAccessException

动态代理生成的类(如Proxy.newProxyInstance)也是运行期才生成字节码,编译期根本不存在对应类文件。

真正容易被忽略的是:编译期检查只是第一道防线,而JVM规范定义的“运行期行为”(如内存模型、指令重排、类初始化顺序)才是决定程序是否正确的底层依据。写对了语法,不代表跑起来就对。

热门AI工具

更多
Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

超级麦吉

一款通过数字员工协作完成调研、数据分析与文档制作的AI办公平台。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

6679

2023.08.02

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

6164

2023.10.24

switch语句用法
switch语句用法

switch语句用法:1、Switch语句只能用于整数类型,枚举类型和String类型,不能用于浮点数类型和布尔类型;2、每个case语句后面必须跟着一个break语句,以防止执行其他case的代码块,没有break语句,将会继续执行下一个case的代码块;3、可以在一个case语句中匹配多个值,使用逗号分隔;4、Switch语句中的default代码块是可选的等等。

1071

2023.09.21

Java switch的用法
Java switch的用法

Java中的switch语句用于根据不同的条件执行不同的代码块。想了解更多switch的相关内容,可以阅读本专题下面的文章。

1417

2024.03.13

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

1798

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

2824

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

6164

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

5929

2023.11.24

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

80

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn