0

假设我有这个简单的类:

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

现在,如果我有这些集合,我知道我正在为集合中的每个元素分配 aString和 an int,但是我是否还int多次存储 static s?这个人为的示例类代表了我多年前编写的那种 Java,在我了解到像这样的幻数更好地使用enum在单独的类中定义的 an 之前,但我一直想知道这段代码的副作用是什么.

4

4 回答 4

5

1.7 JLS开始:

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

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

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

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

于 2013-02-20T16:38:31.610 回答
3

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

于 2013-02-20T16:13:05.910 回答
3

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

于 2013-02-20T16:13:46.047 回答
1

static不维护多个副本。都有objects变量same static。如果他们有,那么你必须给access他们using object,但这不是我们要做的static

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

于 2013-02-20T16:15:15.050 回答