Java中的final和static

Rub*_*uba 25 java variables static final modifiers

我在一本书中读过这句话,但我不理解:

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

有谁可以帮我解释一下?

Mik*_*rds 52

您混淆的根源可能是英语中的"静态"一词及其在Java中的含义只是松散相关.

以"正常"方式在类Cat中定义的变量可以称为实例变量.

class Cat {
   int weight;
}
Run Code Online (Sandbox Code Playgroud)

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

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

class Cat {
   static String speciesName;

   int weight;
}
Run Code Online (Sandbox Code Playgroud)

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

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


Jon*_*nas 26

一个static变量是类的所有实例常见.一个final已被设定后的第一时间变量不能改变.

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

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);
Run Code Online (Sandbox Code Playgroud)

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

  • @Jonas:我会毫不犹豫地将`final`变量称为"常量",因为该术语通常用于编译时变量或声明它们时赋值的变量.相反,我会将`final`变量描述为只能分配一次的变量(在类成员的情况下,这需要在构造函数中). (2认同)
  • @Brian我没有看到原始的措辞,但最终的变量很像Java中的常量.它们以#define的方式编译成代码,并从中产生一些有趣的副作用(例如更改#define并重新编译该类只会更新其他类中的值 - 它们将编译原始值在).你有什么不同的"常数"定义? (2认同)