常量:final修饰的变量
编译期常量
- 原始类型字面量,或者String字面量
- 能转型为原始类型字面量,或String字面量的常量
- 一元运算符(+,-,~,!,但不包含++, --) 和1,2组成的表达式
- 多元运算符(*,/和%)和1,2组成的表达式
- 附加运算符( additive operators) (+ 或 -)与之前几条组成的表达式
- 位移运算符(<<,>>, >>>)和之前几条组成的表达式
- 关系运算符(<,<=,>,>= ,不包括 instanceof)与之前几条组成的表达式
- 关系运算符(==,!=)与之前几条组成的表达式
- 位运算符(&, ^, |)与之前几条组成的表达式
- 条件与和条件或运算符(&&, ||) 与之前几条组成的表达式
- 三元运算符 (?:)和之前几条组成的表达式
- 带括号的表达式,括号内也是常量表达式
- 引用常量变量的简单变量
- 类中的常量变量引用,使用类的全限定名或类名进行引用(String.class)
例如:
有两个基本的编译期常量: static final int a = 1;static final int b = 2;
那么static final int c = a+b 也是编译期常量
运行时常量
依赖于类,涉及到方法的调用,只有在运行时才能确定结果。
示例
class Test1{
static{
System.out.println("Test正在被初始化");
}
public static final int a = 10;//编译期常量
public static final String s = "world";//编译期常量
public static final String s1 = a + s;//编译期常量
public static final int b = "test".length();//运行时常量
public static final Integer a2 = 20;//运行时常量
public static final A a3 = new A();//运行时常量
public static final E e = E.A;//运行时常量
}
class A{
}
enum E{
A,B,C,D,E,F,G
}
可以通过调用属性时是否执行静态代码块来判断。