java文档提到了
静态修饰符与最终修饰符一起使用 用于定义常量。
我只是想知道,可以使用final关键字来定义java中的常量。我知道用final关键字声明的变量和没有static关键字的变量不能改变,但它是否算作常量?
答案 0 :(得分:2)
最终变量是不可变的,但static指定它不是实例变量而是类变量。所以你可以在你的类中使用final变量,但如果你需要它作为一个应用程序范围的常量使用它应该是公共的,你绝对不想创建新的类实例来访问你的常量所以它应该是静止的。
一般来说,你可以使用final作为方法常量。
http://java.about.com/od/understandingdatatypes/a/Using-Constants.htm
答案 1 :(得分:2)
如果不定义static
,您将为每个新实例创建常量的副本。我不确定常量是否必须是唯一的定义,但不要认为,你想要相同常量的多个副本。
答案 2 :(得分:2)
您需要 static 关键字来消除Class实例的上下文。 看看下面的代码:
public class Main {
public static final String CONST;
static {
if((System.currentTimeMillis() % 2) == 0) {
CONST = "FOO";
}
else {
CONST = "BAR";
}
}
public final String CONST2;
public Main(){
if((System.currentTimeMillis() % 2) == 0) {
CONST2 = "FOO";
}
else {
CONST2 = "BAR";
}
}
}
虽然创建 Main 的多个实例会导致 CONST2 的值不同,但是在加载类时会初始化 CONST 与 Main 的几个实例相同。
更有趣的是,如果涉及多个 ClassLoaders ,您甚至可能会有一个带有不同值的静态最终变量。
因此,Java中的常量是最终静态变量,该变量使用常量值初始化。
答案 3 :(得分:1)
如果您将变量声明为final
,则只能为其指定一次值。
非静态最终变量只能在范围内声明,例如在这样的方法中:
public static void main(String[] args) {
final int maxValue = 4711;
// ...
}
在此方法中,您无法更改maxValue
的值。所以它是一个常量,但只在这个方法的范围内可见。
您还可以将类属性声明为final:
public class MyClass {
final String name;
public MyClass() {
name = "Big Jim";
}
// ...
}
因此,在为最终属性赋值后,您无法再对其进行更改。
显然无法从静态方法访问这些变量。
因此,我们通常将final
与static
一起用于常量,因为它们不会绑定到特定实例。
请注意,final关键字仅保护您不为变量赋值。如果类型是可变类,您仍然可以更改实例的内部状态。