我的老师给了我一个问题:
“在Java中创建对象时会发生什么”。
据我所知,在创建对象时会发生内存分配,变量初始化和构造函数方法调用。
但我的老师说我几乎是对的。除了内存堆之外,后来的两件事情是正确的。相反,他说内存分配发生了。我认为该对象存储在堆中,所以我的老师错了。你这么认为吗?
答案 0 :(得分:9)
与往常一样,找到这类问题的解决方案的最佳位置是Java语言规范。
具体来说,从the section on new instance creation可以理解,这是创建新对象时的顺序,只要没有异常发生:
Object
。第一行我的意思是either explicit call to super()
or this()
, or an implicit call to super()
。现在,您的老师可能正在讨论内存分配作为实际的操作系统调用 - 在这种情况下,他是正确的,因为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。