在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
是有意义的。从技术上讲,关键字final
已足以表示常量,因为一旦分配了最终变量的值,就无法更改它。
如果常量与特定对象实例无关,则应使用static
。
例如,假设您有一个Circle
类,并且有一个计算面积的方法。您需要常量Pi
来完成此操作。Pi
常量在每个圆中都不会改变。因此,将Pi声明为静态常量是有意义的。
随你喜欢。我个人会使用 static。当你声明为 static 时,不需要创建对象。此外,您可以创建一个“常量”文件,在其中存储所有常量,例如 public final static ...
因此,如果它是所有对象都使用的“常量”,则基本上使用 static final。如果不是,则只需将其设置为 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.
*/
}