如何在Java中声明常量


71

我们总是写:

public static final int A = 0;  

题:

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

Answers:


38
  1. 您可以enum在Java 5及更高版本中使用一种类型进行描述。这是类型安全的。
  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);
}

1
第二个问题,由于A不能更改,所以它仍然是实例变量
2012年

1
是的,它仍然是一个实例变量。每个创建的对象存在一个。
Oh Chin Boon 2012年

1
是的,但是如果不能更改它,也可以将其设为静态变量:)
Alexander Mills

68

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

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


1
不是Java的专家,但final对我来说听起来像是“只读字段”,并且“常数”在编译时应该是恒定的
fjch1997

-1。警告:final int不能在switch语句中使用A ,这使我认为afinal int不是编译时常量。
starbeamrainbowlabs

实际上,它不是编译时常量。但是,定义“在计算机编程中,常数是程序在正常执行期间无法更改的值,即该值是常数”并不严格要求其为编译时常数,而是运行时常数,所以这个答案仍然是正确的。
eis

4

任何static在课程级别的内容。您无需创建实例即可访问静态字段/方法。加载类后,将创建一次静态变量。

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

就您而言,当您将其声明为时static final,该变量只是一个副本。如果从多个实例更改它,则将更新同一变量(但是,您拥有final变量,因此无法更新)。

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

看一下这个Java教程,以更好地理解,

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.