在Java中创建对象时会发生什么?

时间:2013-06-12 05:52:41

标签: java object memory

我的老师给了我一个问题:

  

“在Java中创建对象时会发生什么”。

据我所知,在创建对象时会发生内存分配,变量初始化和构造函数方法调用。

但我的老师说我几乎是对的。除了内存堆之外,后来的两件事情是正确的。相反,他说内存分配发生了。我认为该对象存储在堆中,所以我的老师错了。你这么认为吗?

5 个答案:

答案 0 :(得分:9)

与往常一样,找到这类问题的解决方案的最佳位置是Java语言规范。

具体来说,从the section on new instance creation可以理解,这是创建新对象时的顺序,只要没有异常发生:

  1. 已分配内存。
  2. 字段为initialized to their default values
  3. 调用所选构造函数的“第一行”,除非它是Object。第一行我的意思是either explicit call to super() or this(), or an implicit call to super()
  4. 执行instance initializer并且fields are initialized to their requested values(实际字段初始化通常编译为实例初始化程序的内联部分)。
  5. 执行其余的构造函数代码。
  6. 现在,您的老师可能正在讨论内存分配作为实际的操作系统调用 - 在这种情况下,他是正确的,因为JVM管理自己的堆,因此Java内存分配不一定转化为操作系统内存分配调用(尽管可能)。

答案 1 :(得分:2)

我将使用一个简单的例子回答这个问题。

假设你有一个班级Car。现在你写:

Car car;
car = new Car();

第一个语句在堆栈中创建一个带有car引用

在第二个语句中,Car类将被加载到主内存,然后它将为堆中Car的成员分配内存。发生这种情况时,将使用JVM提供的值初始化成员。

答案 2 :(得分:2)

当JVM运行程序时,无论何时创建新对象,JVM都会保留该对象的堆的一部分(对象将存储在其中)。保留的堆的数量取决于对象的大小。

JVM在Heap中映射出该段以表示所存储对象的所有属性。对象的引用(Heap中的地址)由JVM保存并存储在一个表中,该表允许JVM跟踪已在Heap上分配的所有对象。 JVM使用这些引用稍后(当程序访问对象时)访问对象。

答案 3 :(得分:1)

除了其他人所说的,如果这是第一次使用该对象,那么它的类必须初始化 - 如JLS(新实例创建之前的部分!)中所述。

这基本上涉及将关于类的必要信息加载到存储器中,即为静态变量和方法表创建一个Klass对象。这也可能涉及加载超类和接口。这全部由ClassLoader执行。

答案 4 :(得分:0)

在Java中创建对象时,这6步将一一发生- 1.JVM为参考变量分配了8个字节的内存,并将默认值分配为null。

  1. JVM将验证是否完成了类加载,如果已经加载了类,则它将忽略,否则将执行类加载。
  2. 在加载类时,如果有任何静态变量,那么它将分配内存。
  3. 通过使用新的运算符,将在堆内存中创建对象内存。
  4. 在创建对象时,如果有任何实例变量,那么这些实例变量将在对象Memory中分配内存。
  5. 它将对象存储地址分配给首先创建的参考变量。