为什么java常量声明为static?

为什么java常量声明为static?

class Foo{ static final int FII = 2 ; } 

在这个我理解使用final? 为什么它必须是静态的? 为什么它应该是一个类变量,而不是一个实例变量?

如果它可能因类的实例而异,那么它显然不是常数 。 为每个Math实例获得不同的pi值意味着什么(不是Math甚至允许构造实例)? 或者每个String实例的不区分大小写排序?

如果常量不是静态的,Java将在类的每个对象中为该常量分配一个内存(即每个对象的常量的一个副本)。

如果常量是静态的,那么该类的常量只有一个副本(即每个类一个副本)。

因此,如果常量只有一个值,则应声明为static。

如果常量可能对每个对象具有不同的值,例如对象的创建时间,则不应将其声明为static。

它只是为了让你可以在没有该类实例的情况下访问它们。

要求创建实例只是为了访问常量字段,这有点浪费资源。