有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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时,我一直想知道这段代码的副作用是什么


共 (4) 个答案

  1. # 1 楼答案

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

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

  2. # 2 楼答案

    任何地方都不会存储副本,会创建对内存中(堆上)同一位置的多个引用

  3. # 3 楼答案

    static变量与类相关,而不是与对象相关。因此,你创建的Object变量在内存中被隔开,所有的Static context都会在类加载时加载,因此,在不创建Object的情况下,你也可以借助class名称访问static变量

  4. # 4 楼答案

    1.7 JLS开始:

    If a field is declared static, there exists exactly one incarnation of the field, no matter how many instances (possibly zero) of the class may eventually be created. A static field, sometimes called a class variable, is incarnated when the class is initialized (§12.4).

    A field that is not declared static (sometimes called a non-static field) is called an instance variable. Whenever a new instance of a class is created (§12.5), a new variable associated with that instance is created for every instance variable declared in that class or any of its superclasses.

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

    为了它的价值: 只有在创建实例时才会分配namecarType实例变量。更重要的是,在java 7之前,等值的String可以被插入到字符串管理的内存中(在PermGen中),保存在一个字符串实例中,该实例在任何地方都被引用。当它被移动到主堆时,它随着java 1.7而改变,并且似乎再次改变(?)与java 8