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

7

可能是重复问题:
Java实例化。

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

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

基本上,我想知道new关键字的魔力是什么?


这个问题在这里得到解答:https://dev59.com/InVC5IYBdhLWcg3wqzHV - aviad
在阅读了那里的答案之后,我仍然感到困惑。不管怎样,谢谢。 - andrew
@andrew,你能具体一点吗?我会尽力让事情清晰明了。 - aviad
1个回答

0

基本上:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接