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后,运⾏结果:
  最后总结⼀下:
1. 编译期常量指的是⽤final关键字修饰的基本类型或String类型并直接赋值(⾮复杂运算)的变量(⽆论是否⽤static修饰);
2. 运⾏时常量是程序在运⾏时才能确定值的⼀种常量;
3. 所有引⽤其他类中静态编译时常量(⼀般就叫静态常量,⽤static final修饰)的类在字节码中全部替换为相应常量的值,所以引⽤静态
常量并不会触发该类的的初始化。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。