Java如何在JVM中创建对象?当我调用构造函数时,堆栈和堆上会发生什么?

and*_*rew 6 java oop

可能重复:
Java实例化.

假设我们有一个java类Test,这个类有两个数据字段a和b,并且有一个方法foo().当我们执行"Test t = new Test()"时,我想知道以下事情.

  1. 堆栈上发生了什么?
  2. 堆上发生了什么?
  3. 我们在运行时有一个类副本和许多实例(对象),对吧?那么课程内容存储在哪里?课程内容是静态的.
  4. 在堆上,我认为应该存储数据字段a和b,因为它们是动态的(特定于某个对象).方法foo()怎么样?我们是否必须将foo()的内容与a和b一起存储在堆上?

基本上,我想知道新关键字的神奇之处?

Kyt*_*yte 0

基本上:

  • 任何类共享代码(实例和静态方法、静态变量等)都将位于您可以称为“程序代码”区域的位置,该区域既不是堆也不是堆栈。
  • 对象本身将在堆中构造,并将包含实例字段以及根据继承指向正确实例方法的指针表(所谓的 vtable)。请注意,该对象将包含继承链中每个类的每个成员,即使您处理它的方式没有显示某些成员。(比如说,C 扩展 B 扩展 A,并且 B 有一个私有字段,C 对象仍将包含 B 字段,即使它是不可见的)。
  • 字段和变量将包含对象引用(基本上是透明指针)或本机类型,例如 int、double 或 boolean(以小写字母开头的类型)。
  • 局部变量和方法参数将存储在堆栈中。