根据JLS,没有要求“常量”应该是静态的。
因此,“常量”可以是静态的也可以是非静态的(实例变量)。
但是JLS对变量成为“常量变量”(除了只是最终变量)施加了一些其他要求:
仅是字符串或原始
仅初始化为内联,因为它是最终的,并且不允许空白的最终
用“常量表达式” =“编译时常量表达式”初始化(请参见下面的JLS引用)
4.12.4。最终变量(JLS)
甲常量变量是原语类型的最终变量或输入与一个常量表达式初始化字符串(§15.28) 。
15.28。常数表达式
甲编译时间常量表达式是表示原始类型或String不突然完成,并且仅使用以下组成的一个值的表达式:
基本类型的文字和字符串类型的文字(§3.10.1,§3.10.2,§3.10.3,§3.10.4,§3.10.5)
强制转换为基本类型,强制转换为字符串(第15.16节)
一元运算符+,-,〜和!(但不是++或-)(§15.15.3,§15.15.4,§15.15.5,§15.15.6)
乘法运算符*,/和%(第15.17节)
加法运算符+和-(§15.18)
移位运算符<>和>>>(第15.19节)
关系运算符和> =(但不包括instanceof)(第15.20节)
等号运算符==和!=(§15.21)
按位和逻辑运算符&,^和| (§15.22)
条件和运算符&&和条件或运算符|| (§15.23,§15.24)
三元条件运算符?:(§15.25)
带括号的表达式(第15.8.5节),其包含的表达式是一个常量表达式。
引用常量变量(第4.2.4节)的简单名称(第6.6.5.6.1节)。
TypeName形式的合格名称(第6.5.6.2节)。引用常量变量的标识符(第4.12.4节)。