Java中的final和static

时间:2010-10-25 21:04:55

标签: java variables static final modifiers

我在一本书中读过这句话,但我不明白:

  

静态和最终的字段只有一个无法更改的存储空间。

任何人都能为我解释一下吗?

4 个答案:

答案 0 :(得分:52)

你混淆的根源可能是英语中的“静态”一词及其在Java中的含义只是松散相关。

以“正常”方式在类Cat中定义的变量可以称为实例变量。

class Cat {
   int weight;
}

每次创建Cat类型的新对象时,都会创建变量“weight”的新副本。如果您创建10个Cat类型的对象,则每个对象都有自己的权重变量副本。

'static'变量可以被认为是类级变量,而不是实例变量。静态变量只有一个副本,属于Cat本身类,而不是每个类型Cat对象的副本。

class Cat {
   static String speciesName;

   int weight;
}

在这里,无论我们创建的Cat类型对象有多少,物种名称只有一个副本。

如果静态变量也是'final',那么该变量的一个副本是唯一无法更改的存储。如果变量'weight'在上面的示例中是最终的,那么将有10个存储空间无法更改 - 我们创建的每个Cat类型的对象都有一个存储空间。

答案 1 :(得分:26)

static变量对于该类的所有实例都是通用的。 final变量在第一次设置后无法更改。

因此,Java中的static final变量对于该类的所有实例都是通用的,并且在第一次设置后无法更改。

class Car {

    static final int numberOfWheels = 4;
    Color color;

    public Car(Color color) {
        this.color = color;
    }
}

Car redCar = new Car(Red);
Car blueCar = new Car(Blue);

现在每辆车都有一个单独的可变属性color,并且它们共享无法更改的属性numberOfWheels

答案 2 :(得分:1)

有关此页面的说明,请参阅“常量”部分:

http://download.oracle.com/javase/tutorial/java/javaOO/classvars.html

答案 3 :(得分:1)

  • 最终表示无法为任何变量重新分配值
  • 静态表示在所有方法的类中只能有一个引用副本。