Java 常量和静态修饰符

Java constants and static modifiers

在 java 中,常量称为关键字 (final),其值永远不会改变。我见过有些人创建常量而不声明静态修饰符。我的问题是,常量是否应该声明为静态的?如果是或不是,为什么?

如果您在声明时为 final 变量赋值,那么它不是 static 是没有意义的,因为每个实例都有自己的具有相同值的变量,即浪费。

但是,如果您需要一个值只能设置一次的实例变量(但不同的实例可能具有不同的值),则该变量必须是 final 而不是 static

例如:

class Person 
{
    final int id;
    public Person(int id) {
        this.id = id;
    }
}

从技术上讲,关键字 final 对于常量就足够了,因为一旦分配了 final 变量的值就无法更改。

如果常量未绑定到特定对象实例,则应使用

static

例如,假设您有一个 Circle class,并且您有一个计算面积的方法。为此,您需要常量 PiPi 常量不会随着圆圈的变化而变化。所以将 Pi 声明为 static final 是有意义的。

随心所欲。我个人会使用静态。将对象声明为静态时不需要创建对象。您也可以制作一个 'constants' 文件,您可以在其中存储所有常量。 public final static ...

因此,如果它是所有对象都使用的 'constant',那么您基本上使用 static final。如果不是,就把它设为final,然后通过构造函数传递它。

您首先需要了解 常量 的作用(即,当您将字段/局部变量标记为 final 时会发生什么)

当一个原始/字符串字段被标记为final时,它变成了一个编译时间常量,即它的值作为字节码本身的一部分传递。因此它的值不是在运行时计算/生成。这会给您带来性能优势。

关键字 static 用于说明 - 此字段对于 class 的每个实例都不是唯一的。您也可以使用非静态 final 常量。此外,如果方法局部变量(原始)被标记为 final,它也成为常量。

所以,不,static 与常量无关。这是一个设计的选择。

带有final关键字的常量永远不会改变..实际上你不能改变这个字段引用的实例,但是你可以改变这个实例中的值。

想象一下这个例子:

class SomeClass {
    final Car MYCAR;
    ...
}

使用此代码,您将无法更改 MYCAR:

的引用

MYCAR = new Car(.....);

但是你可以这样做:

MYCAR.setPrice(10000);

所以是的,如果 SomeClass 的任何实例需要拥有自己的对象副本 MYCAR 但您不需要,则不创建此字段 static 是有必要的希望任何人更改此对象的引用。

当您在 class 中使用关键字 static 时 class 的所有实例。即 class 的所有对象共享同一个变量,如果您将 class 声明为 final,则无法实例化它(无法创建它的对象)。因此,如果您声明一个变量为 final,那么它只能被赋值一次。 假设

class CalculateArea {

    final static double PI = 3.1417;
     /*write rest of the code to calculate area.
     the value of PI will remain constant no matter 
       how many times its object is made
    if you try to override the value of `PI` it will raise an error.
    */
}