当我有一个类的集合时,内存中存储了多少个静态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或无),内存都是按类(非实例)消耗的。
它的价值:您的name
和carType
实例变量仅在创建实例时分配。 更重要的是,在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
做的。
存储引用的惩罚=创建类的惩罚。
- 如何将此格式的日期(Tue Jul 13 00:00:00 CEST 2010)转换为Java日期(该字符串来自露天属性)
- 带有类类型的JavareflectiongetDeclaredMethod()
- Spring @Transactional和Hibernate @LockMode注释是如何相关的
- 使用Java解析HTML数据(DOM解析)
- Prefuse:为GraphView演示添加边权重
- 注入HttpServletRequest
- 我谈到的Web服务器更新了它的SSL证书,现在我的应用程序无法与之通信
- Apache Helix vs YARN
- JSF 2:是否可以inheritance@ManagedBean?