可以单独使用 final 关键字来定义 java 中的常量吗
can the final keyword alone be used to define a constant in java
java 文档提到
The static modifier, in combination with the final modifier, is also
used to define constants.
我只是想知道,在java中是否可以单独使用final关键字来定义常量。我知道用 final 关键字和没有 static 关键字声明的变量不能改变,但它算作一个常量吗?
final 变量是不可变的,但 static 指定它不是实例变量而是 class 变量。所以你可以在你的 class 中使用 final 变量,但是如果你需要它被用作应用程序范围的常量,它应该是 public,你绝对不想创建新的 class 实例来访问您的常量,因此它应该是静态的。
一般来说,您可以只使用 final 作为方法常量。
http://java.about.com/od/understandingdatatypes/a/Using-Constants.htm
通过不定义 static
,您将为每个新实例创建一个常量副本。我不确定根据定义常量是否必须是唯一的,但不要以为您想要同一个常量的多个副本。
您需要 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 的不同值将在加载 class 时初始化,因此在 Main.
的多个实例中保持不变
更有趣的是,如果多个 ClassLoaders 参与其中。
因此,Java 中的常量是一个 最终静态 变量,用常量值初始化。
如果将变量声明为 final
,则只能为其赋值一次。
非静态最终变量只能在范围内声明,例如在这样的方法中:
public static void main(String[] args) {
final int maxValue = 4711;
// ...
}
在此方法中,您无法更改 maxValue
的值。所以它是一个常量,但只在这个方法的范围内可见。
您还可以将 class 属性声明为最终属性:
public class MyClass {
final String name;
public MyClass() {
name = "Big Jim";
}
// ...
}
因此,在为最终属性赋值后,您无法再更改它。
显然无法从静态方法访问这些变量。
所以我们经常将 final
和 static
一起用于常量,因为它们没有绑定到特定实例。
请注意,final 关键字只会防止您为变量分配新值。如果类型是可变的 class 您仍然可以更改实例的内部状态。
java 文档提到
The static modifier, in combination with the final modifier, is also used to define constants.
我只是想知道,在java中是否可以单独使用final关键字来定义常量。我知道用 final 关键字和没有 static 关键字声明的变量不能改变,但它算作一个常量吗?
final 变量是不可变的,但 static 指定它不是实例变量而是 class 变量。所以你可以在你的 class 中使用 final 变量,但是如果你需要它被用作应用程序范围的常量,它应该是 public,你绝对不想创建新的 class 实例来访问您的常量,因此它应该是静态的。
一般来说,您可以只使用 final 作为方法常量。
http://java.about.com/od/understandingdatatypes/a/Using-Constants.htm
通过不定义 static
,您将为每个新实例创建一个常量副本。我不确定根据定义常量是否必须是唯一的,但不要以为您想要同一个常量的多个副本。
您需要 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 的不同值将在加载 class 时初始化,因此在 Main.
的多个实例中保持不变更有趣的是,如果多个 ClassLoaders 参与其中。
因此,Java 中的常量是一个 最终静态 变量,用常量值初始化。
如果将变量声明为 final
,则只能为其赋值一次。
非静态最终变量只能在范围内声明,例如在这样的方法中:
public static void main(String[] args) {
final int maxValue = 4711;
// ...
}
在此方法中,您无法更改 maxValue
的值。所以它是一个常量,但只在这个方法的范围内可见。
您还可以将 class 属性声明为最终属性:
public class MyClass {
final String name;
public MyClass() {
name = "Big Jim";
}
// ...
}
因此,在为最终属性赋值后,您无法再更改它。
显然无法从静态方法访问这些变量。
所以我们经常将 final
和 static
一起用于常量,因为它们没有绑定到特定实例。
请注意,final 关键字只会防止您为变量分配新值。如果类型是可变的 class 您仍然可以更改实例的内部状态。