【问题标题】:What does the JVM do when 'new' operator initializes the memory using the constructor?当 'new' 运算符使用构造函数初始化内存时,JVM 会做什么?
【发布时间】:2016-08-20 14:34:38
【问题描述】:
RealEstate v = new RealEstate();

我已将此 new 关键字与 RealEstate() 一起使用。我知道new 分配内存并使用RealEstate 类构造函数初始化内存。

JVM 在这里做什么?

【问题讨论】:

  • 我觉得这个问题不应该有 6 个反对票,很可能反对票的人不明白 OP 的真正要求。希望 6 位用户奋力反对反对票。
  • @EJP 我看不出这个问题是如何包含它自己的答案的?
  • @EJP 我明白了,但是 OP 实际上是在询问调用 new 运算符时如何初始化内存。例如,当遇到新的字节码指令时,可能会怀疑 JVM 会执行 malloc。据我所知,eckes 对答案的评论是答案。
  • @EJP 对我来说“这个运算符如何初始化内存”是在询问如何在较低级别进行分配。希望OP能确认。
  • @EJP 我认为你没有正确阅读这个问题。我的意思是当 new 运算符使用构造函数初始化内存时 Jvm 实际做了什么?

标签: java constructor new-operator


【解决方案1】:

new 运算符实际上并没有使用构造函数的帮助来分配内存。它与构造函数无关。 Basically Java's version of malloc is new.

new运营商:

  • 为对象分配内存
  • 调用对象构造函数
  • 返回对该内存的引用

构造函数单独执行以在初始化期间执行任何操作,例如为对象和变量分配值。如果没有定义构造函数,那么编译器将创建默认构造函数并分配默认值:


下表总结了几种数据类型的默认值。 source

Data Type   Default Value (for fields)
byte            0
short           0
int             0
long            0L
float           0.0f
double          0.0d
char            '\u0000'
String          null
any object      null
boolean         false

所以,new 运算符只分配内存并返回对该内存的引用。

documentation

new 运算符通过为新对象分配内存并返回对该内存的引用来实例化一个类。 new 运算符还调用对象构造函数。

【讨论】:

  • 不,Java 不对每个对象使用 malloc。实际上,通过增加一个称为 TLAB(线程本地分配缓冲区)的区域中的指针,开销实际上要少得多。 Java 语言规范中指定了接下来发生的事情,这包括运行类层次结构的初始化程序和构造函数。在此之前,对象的实际类也被构造和初始化。 docs.oracle.com/javase/specs/jls/se7/html/jls-12.html#jls-12.5
  • 它首先分配内存,然后调用构造函数,然后返回引用。默认构造函数由编译器创建,而不是 JVM。您已经省略了整数字段的默认值,并且无需为 String 提供默认值,这只是另一个对象。引用的声明来自 Java 教程,而不是“文档”。正确引用的是 Java 语言规范。
  • @EJP 我只想指出初始化期间执行的主要操作。这不应该是它们执行的确切顺序。无论如何,感谢您的通知,我已经相应地更新了我的答案。就默认值图表摘要而言,它知道这不是任何适当的文档,但毕竟它仍然来自oracle。所以我认为它是可以信任的。
猜你喜欢
  • 1970-01-01
  • 2011-11-24
  • 2012-03-25
  • 2011-01-13
  • 1970-01-01
  • 1970-01-01
  • 2021-10-02
  • 1970-01-01
相关资源
最近更新 更多