在java中,常量被称为关键字(final),其值永远不会改变。我见过一些人创建常量时没有声明静态修饰符。我的问题是,常量应该声明为静态的吗?是或不是,为什么?
如果在声明final
变量时给它赋值,那么它不是static
就没有意义了,因为每个实例都有自己的具有相同值的变量,这是浪费的。
但是,如果您需要一个实例变量,其值只能设置一次(但不同的实例可能有不同的值),该变量必须是final
而不是static
。
例如:
class Person
{
final int id;
public Person(int id) {
this.id = id;
}
}
您首先需要了解常量的作用(即,当您将字段/局部变量标记为final
时会发生什么)
当原语/字符串字段被标记为final
时,它变成了一个编译时常量,也就是说,它的值作为字节码本身的一部分传递。因此它的值不是在运行时计算/生成的。这会给您带来性能上的好处。
关键字static
用于表示- 此字段对于类的每个实例不是唯一的。您也可以使用非静态final
常量。同样,如果一个方法局部变量(原语)被标记为final
,它也会变成一个常量。
所以,不,static
与常量无关。这是一个设计选择
final
关键字的常量永远不会改变。实际上你不能改变这个字段所引用的实例,但是你可以改变这个实例中的值。
想象一下这个例子:
class SomeClass {
final Car MYCAR;
...
}
使用此代码,您将无法更改MYCAR
的引用:
MYCAR = new Car(.....);
但是你可以这样做:
MYCAR.setPrice(10000);
所以,是的,如果SomeClass
的任何实例需要拥有对象MYCAR
的自己的副本,但是您不希望任何人更改该对象的引用,则不将此字段设置为static
是有意义的。
随你喜欢。我个人会使用静态。当将对象声明为静态时,不需要创建对象。你也可以创建一个'constants'文件,在里面存储所有的常量,比如。public final static ...
如果它是被所有对象使用的"常量"你基本上使用static final。如果不是,就把它设为final并传递给构造函数。
从技术上讲,关键字final
对于常量来说已经足够了,因为一旦赋值,就不能更改final变量的值。
static
。
例如,假设您有一个Circle
类,并且有一个计算面积的方法。为此,您需要常量Pi
。Pi
常数不随圆周变化。因此将Pi声明为静态final是有意义的。
当您在类中使用关键字static
时,该类的所有实例。也就是说,一个类的所有对象共享同一个变量,如果你声明一个类为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.
*/
}