这是Java中的构造函数分配内存的方式吗?

时间:2011-02-26 07:13:16

标签: java

创建对象后会自动调用默认构造函数。

但在Java中,当我们使用new运算符(即classname obj = new classname();)分配内存时,构造函数会自动调用,然后再将新内存分配给类成员。

在类进入物理存在之后开始分配但是如果new操作符在调用默认构造函数后完成其进程,那么默认构造函数实际上是如何实现的,因为类还没有实际存在?

有人能用一个明确的例子解释我吗?

5 个答案:

答案 0 :(得分:9)

这个过程基本上是:

  • 分配内存
  • 执行 up 构造函数链(即对其他构造函数的所有this / super调用)每个级别评估上述级别的任何参数,但这都是< / LI>
  • 执行 down 实际构造函数体的构造函数链。因此首先执行java.lang.Object构造函数的主体,然后执行直接子类等。这也是在执行变量初始化程序时执行的。 (在此之前,变量的默认值为null等。)
  • 该引用将返回给new
  • 的任何人

默认构造函数的概念在执行时没有意义。它只是一个无参数构造函数,就JVM而言,它调用super()

关于构造函数链的业务与它们是第一行的方法完全相同,第一行只链接到下一个构造函数;它只是一堆电话。

答案 1 :(得分:2)

  

但是在Java中我们使用new运算符分配内存,即classname obj = new classname();在new将内存分配给类成员之前,会自动调用构造函数。

这是不正确的。 内存分配后,调用构造函数。

@Jon Skeet的答案清楚地解释了在对象创建过程中发生的事件序列。

您可能会对构造函数可能导致分配更多对象的事实感到困惑;例如在执行声明初始化程序期间。但是这些对象不占用原始对象的内存;即我们正在建造的物体。


如果您想要创建对象时发生的权威规范,请阅读Java语言规范 - 特别是JLS 12.5

答案 2 :(得分:0)

  

创建对象后会自动调用默认构造函数。

是(如果调用了默认(无参数)构造函数)。

  

有人可以使用一个明确的例子来解释我。

我不确定我是否理解你的问题100%但是没有在Java语言规范中说它构造函数应该在分配对象的内存之前运行它的代码。 / p>

Java语言规范中的Section 12.5: Creation of new Class Instances中的示例详细解释了这一点。

答案 3 :(得分:0)

如果我们考虑像classname obj = new classname(); classname obj初始化对象和新的classname();为对象分配内存位置。如果你有一个构造函数,那么调用构造函数,否则调用默认构造函数。

答案 4 :(得分:0)

  

“......那么默认构造函数实际上是如何实现的,因为类还没有实际存在。”

该类已经在内存中,new运算符分配内存空间来保存特定于新实例的实例变量和父实例变量。但是这个阶级之前已经进入了实体存在。