Java编译时常量和运行时常量
Java编译时常量和运行时常量
编译期常量指的就是程序在编译时就能确定这个常量的具体值。
非编译期常量就是程序在运行时才能确定常量的值,因此也称为运行时常量。
在Java中,编译期常量指的是用final关键字修饰的基本类型或String类型并直接赋值(非复杂运算)的变量(无论是否用static修饰),是编译器的一种优化,体现在字节码文件中;运行是常量是由运行时解释器解释完成的。
运行时常量很容易理解,接下来会简单的结合字节码文件来介绍编译时常量及使用风险。
public class ConstantTest {
public final int a = 1; //编译时常量
public final int b = 1+2; //编译时常量 支持加减乘除等简单运算
public final int c = b+3; //编译时常量
public final static int d = 10; //编译时常量
public final String str1 = "abc"; //编译时常量
public final String str2 = "def" + "ghi"; //编译时常量 支持字符串的连接
public final String str3 = str2 + "jkl"; //编译时常量
public final static String str4 = "static str"; //编译时常量
public final double e = Math.random(); //运行时常量
public final ConstantTest test = new ConstantTest(); //运行时常量
}
下面是编译后相应的字节码信息:

注意!!!!!!
类B中所有引用类A中用static final修饰的静态编译时常量都会在编译时全部替换为相应的数值或字符串,所以当修改了类A中的静态编译时常量时,类A和类B都要重新编译,如果只重新编译类A,则类B还是会引用之前的常量。
以下是案例:
类ConstantTest:
public class ConstantTest {
public final int a = 1;
public final int b = 1+2;
public final int c = b+3;
public final static int d = 10;
public final String str1 = "abc";
public final String str2 = "def" + "ghi";
public final String str3 = str2 + "jkl";
public final static String str4 = "static str";
public final double e = Math.random();
public final ConstantTest test = new ConstantTest();
}
类Test引用ConstantTest中的静态编译时常量:
public class Test{
public int m = ConstantTest.d;
public static int n = ConstantTest.d;
public final int g = ConstantTest.d;
public static final int j = ConstantTest.d;
public static void main(String[] args) {
int k = ConstantTest.d;
System.out.println("m="+new Test().m);
System.out.println("n="+n);
System.out.println("g="+new Test().g);
System.out.println("j="+j);
System.out.println("k="+k);
}
}
首先全部编译,运行Test类:

修改ConstantTest中静态常量的值为20后只重新编译ConstantTest,运行结果:

重新编译Test后,运行结果:

最后总结一下:
- 编译期常量指的是用final关键字修饰的基本类型或String类型并直接赋值(非复杂运算)的变量(无论是否用static修饰);
- 运行时常量是程序在运行时才能确定值的一种常量;
- 所有引用其他类中静态编译时常量(一般就叫静态常量,用static final修饰)的类在字节码中全部替换为相应常量的值,所以引用静态常量并不会触发该类的的初始化。
Java编译时常量和运行时常量的更多相关文章
- Java编译时多态和运行时多态
来源:https://blog.csdn.net/wendizhou/article/details/73733061 编译时多态:主要是方法的重载,通过参数列表的不同来区分不同的方法. 运行时多态: ...
- 正确理解java编译时,运行时以及构建时这三个概念
Java中的许多对象(一般都是具有父子类关系的父类对象)在运行时都会出现两种类型:编译时类型和运行时类型,例如:Person person = new Student();这行代码将会生成一个pers ...
- [转] Java 的泛型擦除和运行时泛型信息获取
原文链接 https://my.oschina.net/lifany/blog/875769 前言 现在很多程序员都会在简历中写上精通 Java.但究竟怎样才算是精通 Java 呢?我觉得不仅要熟练掌 ...
- 将子类对象引用赋值给超类对象 JAVA 编译时多态性
将子类对象引用赋值给超类对象 JAVA 编译时多态性(转) (2012-05-10 11:24:05) 转载▼ 标签: 杂谈 分类: 也无晴_soft 1.通过将子类对象引用赋值给超类对象引用变量来实 ...
- in C#,编译型常量(const)和运行时常量(readonly)
readonly 关键字与 const 关键字不同. const 字段只能在该字段的声明中初始化. readonly 字段可以在声明或构造函数中初始化. 因此,根据所使用的构造函数, readonly ...
- 关于JAVA编译时找不到自定义包的问题
这两天照网上的教程,学习JSP/SERVLET/JAVABEAN,写了几个JAVA文件,目录放在TOMCAT的WEBAPPS下面,通过javac编译时,老提示找不到指定的包: 下图是我的目录路径: 通 ...
- java 编译时注解框架 lombok-ex
lombok-ex lombok-ex 是一款类似于 lombok 的编译时注解框架. 编译时注,拥有运行时注解的便利性,和无任何损失的性能. 主要补充一些 lombok 没有实现,且自己会用到的常见 ...
- Java编译时根据调用该方法的类或对象所属的类决定
class Base{ int x = 1; static int y = 2; } class Subclass extends Base{ int x = 4; i ...
- Java方法区和运行时常量池溢出问题分析
运行时常量池是方法区的一部分,方法区用于存放Class的相关信息,如类名.访问修饰符.常量池.字段描述.方法描述等. String.intern()是一个native方法,它的作用是:如果字符串常量池 ...
随机推荐
- 学习spring和spring mvc过程中遇到的一些问题
以下仅为个人通过网上查找资料总结的内容,如有不对的地方欢迎提出: 注解: @Controller//表明本类是一个Controller @RequestMapping(value="/dem ...
- ElasticSearch的API使用
前言:之前写过如何安装ElasticSearch(以下简称ES)以及简单的crud的使用实例的博客,不过ElasticSearch的版本变化太快,像之前的5.6版本使用的TransPortClient ...
- Spring面试题集锦(精选)
以下来自网络收集,找不到原文出处.此次主要为了面试收集,希望对大家有所帮助~~~~ 1.什么是Spring? Spring是一个开源的Java EE开发框架.Spring框架的核心功能可以应用在任何J ...
- 源码分析 RocketMQ DLedger 多副本之 Leader 选主
目录 1.DLedger关于选主的核心类图 1.1 DLedgerConfig 1.2 MemberState 1.3 raft协议相关 1.4 DLedgerRpcService 1.5 DLedg ...
- 化鲲为鹏,我有话说 ,鲲鹏ARM架构的优势
首先我在想为什么会用到鲲鹏,我个人认为最重要的还是要掌握自主研发的能力,打破国外关键技术的封锁.鲲鹏芯片完全是华为于自主设计内核,华为云Kunpeng服务器关键计算芯片全自研,提供产品可持续供应能力. ...
- #华为云·寻找黑马程序员#【代码重构之路】如何“消除”if/else
1. 背景 if/else是高级编程语言中最基础的功能,虽然 if/else 是必须的,但滥用 if/else,特别是各种大量的if/else嵌套,会对代码的可读性.可维护性造成很大伤害,对于阅读代码 ...
- postman tests常用方法
postman常用方法集合: 1.设置环境变量 postman.setEnvironmentVariable("key", "value"); pm.envir ...
- POJ1743 Musical Theme (后缀数组 & 后缀自动机)最大不重叠相似子串
A musical melody is represented as a sequence of N (1<=N<=20000)notes that are integers in the ...
- CodeForces 5C Longest Regular Backet sequence
This is yet another problem dealing with regular bracket sequences. We should remind you that a brac ...
- 基于STM32 HID 游戏手柄开发调试
stm32自带usb接口,非常适合做hid设备,免驱开发也很方便. 使用stm32通过正确的报告描述符配置后,插入usb,电脑正确识别如下(设备和打印机) 可以通过右键,游戏控制器设置 通过选择属性 ...