Java编译期常量
2014-03-23 17:42
423 查看
public class Const{ public static void main(String args[]){ //System.out.println(Data.i1); //System.out.println(Data.i2);//initialization! //System.out.println(Data.b1);//initialization! //System.out.println(Data.s1); //System.out.println(Data.i3);//initialization! //System.out.println(Data.a); //initialization! //System.out.println(Data.e); //initialization! } } class Data{ static{ System.out.println("initialization!"); } public static final int i1=0; public static final Integer i2=0; public static final Boolean b1=true; public static final String s1="0"; public static final int i3=s1.length(); public static final A a=new A(); public static final Enum e=E.A; } class A{ } enum E { A,B,C,D,E,F,G; }
class PrintWords { publicstaticvoid main(String[] args) { System.out//引用常量变量 .println(Words.FIRST + " " + Words.SECOND + " " + Words.THIRD); } } class Words { // 常量变量 publicstaticfinal String FIRST = "the"; // 非常量变量 publicstaticfinal String SECOND = null; // 常量变量 publicstaticfinal String THIRD = "set"; }
现在假设你像下面这样改变了那个库类并且重新编译了这个类,但并不重新编译客户端的程序PrintWords:
class Words {
publicstaticfinal String FIRST = "physics";
publicstaticfinal String SECOND = "chemistry";
publicstaticfinal String THIRD = "biology";
}
此时,端的程序会打印出什么呢?结果是 the chemistry set,不是the null set,也不是physics chemistry biology,为什么?原因就是 null 不是一个编译期常量表达式,而其他两个都是。
对于常量变量(如上面Words类中的FIRST、THIRD)的引用(如在PrintWords类中对Words.FIRST、Words.THIRD的引用)会在编译期被转换为它们所表示的常量的值(即PrintWords类中的Words.FIRST、Words.THIRD引用会替换成"the"与"set")。
一个常量变量(如上面Words类中的FIRST、THIRD)的定义是,一个在编译期被常量表达式(即编译期常量表达式)初始化的final的原生类型或String类型的变量。
那什么是“编译期常量表达式”?精确定义在[JLS 15.28]中可以找到,这样要说的是null不是一个编译期常量表达式。
由于常量变量会编译进客户端,API的设计者在设计一个常量域之前应该仔细考虑一下是否应该定义成常量变量。
如果你使用了一个非常量的表达式去初始化一个域,甚至是一个final或,那么这个域就不是一个常量。下面你可以通过将一个常量表达式传给一个方法使用得它变成一个非常量:
class Words {
// 以下都成非常量变量
publicstaticfinal String FIRST = ident("the");
publicstaticfinal String SECOND = ident(null);
publicstaticfinal String THIRD = ident("set");
privatestatic String ident(String s) {
return s;
}
}
总之,常量变量将会被编译进那些引用它们的类中。一个常量变量就是任何常量表达式初始化的原生类型或字符串变量。且null不是一个常量表达式。
相关文章推荐
- java编译期常量 static final
- What is a compile time constant?Java编译期常量表达式
- java 编译期常量
- Java 中的编译期常量是什么?使用它有什么风险?
- java 编译期常量
- java中定义常量和变量
- java中变量 常量的存储
- 01_Java基础_第1天(Java概述、环境变量、注释、关键字、标识符、常量)
- 一种基于Spring的java程序常量管理思路
- 编译期强制函数参数为字符串常量
- Java内功提升之变量与常量
- I学霸官方免费教程四:Java基础之数据类型 常量 变量 数据类型转换
- java中导入常量
- Android Java 与 C++ 调用过程中的常量,路径名、文件名、后缀名最大长度
- 黑马程序员——Java基础语法(一)---关键字、常量、变量、运算符
- java 中的常量定义,final 的问题
- Java常量和变量及数据类型
- java 的一些基础知识— 关键字、标识符、注释、常量和变量、........
- JAVA基础1 语法基础变量与常量
- Java心得体会之常量