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

Java 当我有静态final属性的类集合时,它们在内存中存储了多少个副本,java,memory,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; } 现在,如果我有一个这些元素的集合,我知道我正在为集合中的每个元素分配一个String和一个int,但是我是否也多次存储静态ints?这个人为设计的示例类代表了我多年前编写的Java

假设我有一个简单的类:

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
s?这个人为设计的示例类代表了我多年前编写的Java类型,在此之前,我了解到像这样的神奇数字最好使用在单独类中定义的
enum
,但我一直想知道这段代码的副作用是什么。

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

static
变量与类相关,而不是与对象相关。因此,您创建的大量
对象
,但
静态
变量将在内存中间隔一次,所有
静态上下文
将在类加载时加载,因此无需创建
对象
,您也可以借助
名称访问您的
静态
变量。

保持静态
。所有
对象
都具有相同的
静态变量。如果他们有它,那么您必须使用对象
访问
他们
,但这不是我们使用
静态
所做的

存储引用的代价=创建类的代价。

来自:

如果一个字段被声明为静态的,那么不管最终创建了多少个类实例(可能为零),该字段只存在一个化身。静态字段(有时称为类变量)在初始化类时具体化(§12.4)

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

需要注意的关键点是,内存是在每个类(而不是实例)的基础上消耗的,不管您有多少个实例(1000个或没有)

为了它的价值:
您的
名称
carType
实例变量仅在创建实例时分配。更重要的是,在java 7之前,
String
s的相等值可以被插入到字符串管理的内存中(在PermGen中),保存在一个字符串实例中,该实例在任何地方都被引用。当它被移动到主堆时,它发生了变化,并且似乎再次发生变化(?)与

,因此惩罚是存储不必要的引用?@JasonSperske存储引用的惩罚=创建类的惩罚。所以这不重要这是更合适的回答哇,不是开玩笑。这个答案太棒了!