在java中,常量被称为关键字(final),其值永远不会改变。我见过有些人在没有声明静态修饰符的情况下创建常量。我的问题是,应该将常量声明为静态的吗?如果是或不是,为什么?
6 回答
如果final
在声明变量时为变量赋值,那么 not being 没有任何意义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);
所以是的,static
如果任何实例SomeClass
需要拥有自己的对象副本MYCAR
但您不希望任何人更改此对象的引用,则不要创建此字段是有道理的。
从技术上讲,关键字final
对于常量来说就足够了,因为一旦分配,您就无法更改最终变量的值。
static
如果常量未绑定到特定对象实例,则应使用该常量。
例如,假设您有一个Circle
班级,并且您有一个计算面积的方法。Pi
为此,您需要常量。Pi
常数不会因圈而异。因此,将 Pi 声明为静态 final 是有意义的。
随你喜欢。我个人会使用静态的。当您声明它是静态的时,您不需要创建一个对象。您还可以制作一个“常量”文件,在其中存储所有常量,例如。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.
*/
}