常量表达式

今天写代码的时候遇到一个问题,结合到sun对string常量表达式的优化,所以想问一个问题,到底如何定义“常量表达式”

先看代码演示一
[code="java"]
public class Test {

public void test(int i) {
    Type type = new Type();
    switch(i) {
    case type.decimal:  //需要常量表达式
        break;
    case Type.octal:   //此处正确
        break;
    }
}

}

class Type {
static final int decimal = 1;
static final int octal = 2;
}
[/code]

代码演示二
[code="java"]
public class Test {
public static void main(String args[]) {

    String str = "abcd";   //存储在constant pool中
    String str1 = "abc"    //存储在constant pool中

    String str2 = "a"+str1;  //str1 为非常量表达式,编译器不优化
    System.out.println((str == str1));
    //result false
}

}
[/code]
[code="java"]
public class Test {
public static void main(String args[]) {
//当bb为常量表达式时时候,编译器将会对其进行优化
String a = "abc"; //存储在constant pool中
final String bb = "bc";//存储在constant pool中
String b = "a" + bb; // bb为常量表达式,编译器直接优化
System.out.println((a == b)); //result = true
}

}
[/code]

最终问题什么是常量表达式,系统是如何判断该对象是否为常量表达式的?
[b]问题补充:[/b]
代码一中的type.decimal的值也不会变啊!

常量表达式就是在编译期间能计算出来的值,

也就是不能有对象分配这种运行时的概念

可以看看之前小的记的一篇,[url]http://ravenex.iteye.com/blog/460560[/url]

简单说,表达式的值总不会变、编译时能出结果的的表达式。

因为“type”是变量而不是常量,所以Java编译器不把后面的.decimal纳入常量表达式范围内,即便它实际上跟Type.decimal所指为同物。