【问题标题】:How to declare a constant in Java?如何在 Java 中声明一个常量?
【发布时间】:2012-09-29 07:48:54
【问题描述】:

我们总是写:

public static final int A = 0;  

问题:

  1. static final 是在类中声明 constant 的唯一方法吗?
  2. 如果我改为写public final int A = 0;A 仍然是一个常量还是只是一个实例字段
  3. 什么是实例变量实例变量实例字段有什么区别?

【问题讨论】:

标签: java constants


【解决方案1】:

final 表示初始化后值不能更改,这就是使其成为常量的原因。 static 表示不是为每个对象中的字段分配空间,而是为该类创建一个实例。

所以,static final 表示变量只有一个实例,无论创建多少对象,该变量的值永远不会改变。

【讨论】:

  • 不是 Java 专家,但 final 对我来说听起来像是“只读字段”,并且“常量”在编译时应该是常量
  • -1。警告:final int 不能在 switch 语句中使用,这让我相信 final int 不是编译时常量。
  • 确实,它不是编译时常数。但是,“在计算机编程中,常量是程序在正常执行期间无法更改的值,即该值是常量”的定义并不严格要求它是编译时常量,而是运行时常量,所以这个答案仍然是正确的。
【解决方案2】:
  1. 您可以在 Java 5 及更高版本中使用 enum 类型来实现您所描述的目的。它是类型安全的。
  2. A 是一个实例变量。 (如果它有 static 修饰符,那么它就变成了一个静态变量。)常量只是意味着值不会改变。
  3. 实例变量是属于对象而非类的数据成员。实例变量 = 实例字段。

如果您在谈论实例变量和类变量之间的区别,则每个创建的对象都存在实例变量。而无论创建的对象数量如何,类变量每个类加载器只有一个副本。

Java 5 及更高版本enum 类型

public enum Color{
 RED("Red"), GREEN("Green");

 private Color(String color){
    this.color = color;
  }

  private String color;

  public String getColor(){
    return this.color;
  }

  public String toString(){
    return this.color;
  }
}

如果您希望更改您创建的枚举的值,请提供一个 mutator 方法。

public enum Color{
 RED("Red"), GREEN("Green");

 private Color(String color){
    this.color = color;
  }

  private String color;

  public String getColor(){
    return this.color;
  }

  public void setColor(String color){
    this.color = color;
  }

  public String toString(){
    return this.color;
  }
}

访问示例:

public static void main(String args[]){
  System.out.println(Color.RED.getColor());

  // or

  System.out.println(Color.GREEN);
}

【讨论】:

  • 第二个问题,既然A不能改,那它还是一个实例变量 ?
  • 是的,它仍然是一个实例变量。每个创建的对象都存在一个。
  • 对,但如果不能更改,你也可以将其设为静态变量:)
【解决方案3】:

任何static 都属于类级别。您不必创建实例来访问静态字段/方法。静态变量将在加载类时创建一次。

实例变量是与对象关联的变量,这意味着为您创建的每个对象创建实例变量。所有对象都将拥有自己的实例变量的单独副本。

在您的情况下,当您将其声明为 static final 时,这只是变量的一份副本。如果您从多个实例更改它,则会更新相同的变量(但是,您有 final 变量,因此无法更新)。

在第二种情况下,final int a 也是常量,但是每次创建声明该变量的类的实例时都会创建它。

请查看this Java tutorial 以获得更好的理解,

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-22
    • 1970-01-01
    • 2017-10-09
    • 2010-10-30
    • 1970-01-01
    相关资源
    最近更新 更多