可以使用final关键字来定义java中的常量

时间:2016-04-06 13:59:11

标签: java variables static constants final

java文档提到了

  

静态修饰符与最终修饰符一起使用   用于定义常量。

我只是想知道,可以使用final关键字来定义java中的常量。我知道用final关键字声明的变量和没有static关键字的变量不能改变,但它是否算作常量?

4 个答案:

答案 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";
  }
  // ...
}

因此,在为最终属性赋值后,您无法再对其进行更改。

显然无法从静态方法访问这些变量。

因此,我们通常将finalstatic一起用于常量,因为它们不会绑定到特定实例。

请注意,final关键字仅保护您不为变量赋值。如果类型是可变类,您仍然可以更改实例的内部状态。