Java常量和静态修饰符

4

在Java中,常量被称为关键字(final),其值永远不会改变。我看到有些人创建常量时没有声明静态修饰符。我的问题是,常量应该声明为静态吗?如果是或者不是,为什么?

答案是,常量应该被声明为静态。这是因为静态常量在整个程序中只有一个实例,可以通过类名直接访问,而不需要创建对象。如果常量没有被声明为静态,那么每次创建对象时都会重新创建一个新的常量,这样会浪费内存空间。


任何使用案例?例如? - Suresh Atta
6个回答

4
如果在声明时给final变量分配一个值,那么它不是static就没有意义,因为每个实例都有一个相同值的变量,这是浪费的。
然而,如果需要一个实例变量,其值只能设置一次(但不同实例可能具有不同的值),那么该变量必须为final但不是static
例如:
class Person 
{
    final int id;
    public Person(int id) {
        this.id = id;
    }
}

我不完全同意你的答案。 如果我的Person实例有一个List/Map,那么我通常将该List声明为final,但不是static,因为内容属于类的实例。 如果我理解有误,请纠正我。 - metters
1
@metters 这个问题是关于常量(原始类型、字符串和其他不可变类型)的,我的回答是没有必要定义非静态常量(因为它们都将始终保持相同的值)。我同意,如果您有一个最终变量引用某些可变实例(例如您的List或Map),类的不同实例可以以不同的方式改变该实例,因此我的答案在这种情况下不适用。 - Eran
是的,它们(列表)不是不可变的。非常感谢! - metters

2

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

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

关键字static用于表示 - 这个字段对于类的每个实例都是不唯一的。您也可以有非静态final常量。此外,如果将方法局部变量(原始类型)标记为final,它也会变成一个常量。

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


1

final关键字定义的常量永远不会改变。实际上,你不能改变该字段所引用的实例,但是你可以更改此实例内的值。

想象一下这个例子:

class SomeClass {
    final Car MYCAR;
    ...
}

使用这段代码,您将无法更改MYCAR的引用:

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

但是您可以执行类似以下操作:

MYCAR.setPrice(10000);

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

0

从技术上讲,关键字final已足以表示常量,因为一旦分配了最终变量的值,就无法更改它。

如果常量与特定对象实例无关,则应使用static

例如,假设您有一个Circle类,并且有一个计算面积的方法。您需要常量Pi来完成此操作。Pi常量在每个圆中都不会改变。因此,将Pi声明为静态常量是有意义的。


0

随你喜欢。我个人会使用 static。当你声明为 static 时,不需要创建对象。此外,您可以创建一个“常量”文件,在其中存储所有常量,例如 public final static ...

因此,如果它是所有对象都使用的“常量”,则基本上使用 static final。如果不是,则只需将其设置为 final 并通过构造函数传递即可。


0
当您在类中使用关键字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.
    */
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接