当我有一个类的集合时,内存中存储了多少个静态final属性的副本

假设我有这个简单的类:

public class Car { public static final int TYPE_SUV = 1; public static final int TYPE_TRUCK = 2; public String name; public int carType; } 

现在,如果我有这些的集合,我知道我正在为集合中的每个元素分配一个String和一个int ,但我是否也多次存储静态int ? 这个设计的示例类代表了我在几年前写的那种Java之前我才知道像这样的幻想数字更好地服务于一个单独的类中定义的enum ,但我总是想知道这个代码的副作用是什么是。

从1.7 JLS :

如果一个字段被声明为static,那么无论该类最终可以创建多少个实例(可能为零),都只存在该字段的一个化身。 静态字段(有时称为类变量)在初始化类时实现(第12.4节)。

未声明为静态的字段(有时称为非静态字段)称为实例变量。 每当创建一个新的类实例(第12.5节)时,就会为该类或其任何超类中声明的每个实例变量创建一个与该实例关联的新变量。

需要注意的关键点是,无论您拥有多少实例(1,1000或无),内存都是按类(非实例)消耗的。

它的价值:您的namecarType实例变量仅在创建实例时分配。 更重要的是,在java 7之前,可以将一个相等值的String – 在一个被引用的单个String实例中维护 – 保存在一个字符串管理的内存中(在PermGen中)。 当它被移动到主堆并且似乎用java 8再次改变(?)时,这改变了java 1.7

没有副本存储在任何地方,创建了对内存中(堆上)相同位置的多个引用。

static变量与不与Object有关的类有关。 因此,您创建的Object很多,但static变量将在内存中间隔开,并且所有Static context在类加载时加载,因此无需创建Object您也可以在class名的帮助下访问static变量。

不保留static多个副本。 所有objects都有same static变量。 如果他们拥有它,那么你必须using object access它们,但这不是我们用static做的。

存储引用的惩罚=创建类的惩罚。