java当我有一个静态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 楼答案
没有维护}变量。如果他们有,那么你必须
static
的多个副本。所有objects
都有same
{access
他们using object
,但这不是我们用static
做的存储引用的代价=创建类的代价
# 2 楼答案
任何地方都不会存储副本,会创建对内存中(堆上)同一位置的多个引用
# 3 楼答案
static
变量与类相关,而不是与对象相关。因此,你创建的Object
变量在内存中被隔开,所有的Static context
都会在类加载时加载,因此,在不创建Object
的情况下,你也可以借助class
名称访问static
变量# 4 楼答案
从1.7 JLS开始:
需要注意的关键点是,内存是在每个类(而不是实例)的基础上消耗的,不管您有多少个实例(1000个或没有)
为了它的价值: 只有在创建实例时才会分配
name
和carType
实例变量。更重要的是,在java 7之前,等值的String
可以被插入到字符串管理的内存中(在PermGen中),保存在一个字符串实例中,该实例在任何地方都被引用。当它被移动到主堆时,它随着java 1.7而改变,并且似乎再次改变(?)与java 8