我知道常量是那些值无法更改的变量,但是如果程序的任何部分没有更改它们的值,它们是否仍然需要声明final
?它似乎也必须是静态的。那是为什么?
答案 0 :(得分:6)
您实际上是在问我想要回答几个问题。
常量用于避免代码中的magic numbers/strings。如果您的代码中有多个字符串出现,那么一旦您需要更改该字符串,您只需要更改常量定义,而不是更改代码中每次出现的字符串。此外,如果只使用一个常数,它通常是一件好事,因为它具有更好的可见性。
final
关键字。它的目的(至少在这种情况下)是双重的。一个是让程序员无法改变价值。你可能已经忘记它是一个常数。另一种是告诉编译器该值在运行时不能更改。这可用于创建优化的字节码(例如,可以删除常量,并且每次出现都会被编译器的值替换。)
static
关键字。在Java中,一切都是一个类。每个 Class 都可以有多个实例(对象)。如果你不将常量标记为static
,则每个对象都有“自己的常数”。既然你不想要将它标记为静态是有意义的。静态字段(或方法)每个类只存在一次(而不是每个类的对象一次)。
答案 1 :(得分:4)
当然可以宣布非静态决赛:
class Employee {
final String empId;
public Employee(String empId) { this.empId = empId; }
}
在其他情况下,您希望字段在类的所有实例中保持不变:
class Color {
final static int BLACK = 0xFFFFFF;
}
至于为什么你想要声明它们final
而不是永远不改变它们,
答案 2 :(得分:3)
通常,当您要在代码上使用常量值时,声明最终的静态变量。这可以防止你在代码周围散布“魔术值”,这不是一个好的做法,因为可持续性和易读性原因。
如果您未声明最终,则其他人(或您,如果您忘记了初始意图)制作的代码可能会修改该变量。
如果你没有声明它们静态,你创建的类的每个实例都会有一个副本,你也必须创建一个实例来获取值。这通常不是你想要的。
答案 3 :(得分:3)
因为静态属于类而不是任何实例。
在所有实例中共享static
个单一副本时。 instance
成员拥有个人副本的地方。
考虑你需要在游戏的每个阶段(阶段课程)中增加/减少游戏分数(count
)。
答案 4 :(得分:2)
这不是绝对必要的,但出于记忆效率的原因推荐它:
如果你没有将你的常量声明为static
,那么创建的每个类的实例(可能是数千个)将保留它在内存中的常量(或至少是对它的引用)的值,而static
成员每个班级只保留一次 - 因为无论如何它都是常数,这就足够了。
答案 5 :(得分:2)
我们声明常量因为我们总是需要一些在代码中修复的“幻数”。使用常量意味着它们更容易被发现,并且当您更改它们时,您将通过编辑更改所有这些。
想象一下,您的代码定义了您的窗口会显示15
条记录,并且您会在15
岁时将其视为成年人。如果没有常量,更改窗口的大小意味着您必须找到15
次发生,不要错过任何一次,并且不要更改15
,这意味着错误的年龄。
static
部分是因为您不想实例化一个对象来获取与特定实例无关的数据(这正是static
的意思,顺便说一句,不仅仅是在使用时对于常数)。