如何在Java中声明一个常量

时间:2012-10-09 03:00:02

标签: java constants

我们总是写:

public static final int A = 0;  

问题:

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

3 个答案:

答案 0 :(得分:60)

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

因此,static final仅表示变量的一个实例,无论创建了多少个对象,并且该变量的值永远不会改变。

答案 1 :(得分:35)

  1. 您可以在Java 5及更高版本中使用enum类型,以达到您所描述的目的。它是类型安全的。
  2. A是一个实例变量。 (如果它有静态修饰符,则它变为静态变量。)常量只表示值不会改变。
  3. 实例变量是属于对象而不是类的数据成员。实例变量=实例字段。
  4. 如果您正在讨论实例变量和类变量之间的区别,则每个创建的对象都存在实例变量。而类变量每个类加载器只有一个副本,而不管创建的对象数是多少。

    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);
    }
    

答案 2 :(得分:3)

static的任何内容都属于班级。您不必创建实例来访问静态字段/方法。加载类时将创建一次静态变量。 实例变量是与对象关联的变量。这意味着为您创建的每个对象创建实例变量。所有对象都有自己的实例变量的单独副本。 在您的情况下,当您将其声明为static final时,这只是变量的一个副本。如果从多个实例更改它,则会更新相同的变量(但是,您有final变量,因此无法更新)。 在第二种情况下,final int a也是常量,但是每次创建声明该变量的类的实例时都会创建它。

了解this Java tutorial以便更好地理解,