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

Jas*_*ske 0 java memory

假设我有这个简单的类:

public class Car {
  public static final int TYPE_SUV = 1;
  public static final int TYPE_TRUCK = 2;
  public String name;
  public int carType;
}
Run Code Online (Sandbox Code Playgroud)

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

wmo*_*365 5

1.7 JLS:

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

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

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

对于什么是价值:你namecarType创建一个实例时,实例变量是只分配.更重要的是,在java 7之前,String可以将一个相等值的s实例化 - 在一个被引用的任何地方使用的单个String实例中维护 - 进入一个字符串管理的内存(在PermGen中).当它被移动到主堆并且似乎用java 8再次改变(?)时,这改变了java 1.7