创建对象后会自动调用默认构造函数。
但在Java中,当我们使用new运算符(即classname obj = new classname();
)分配内存时,构造函数会自动调用,然后再将新内存分配给类成员。
在类进入物理存在之后开始分配但是如果new操作符在调用默认构造函数后完成其进程,那么默认构造函数实际上是如何实现的,因为类还没有实际存在?
有人能用一个明确的例子解释我吗?
答案 0 :(得分:9)
这个过程基本上是:
this
/ super
调用)每个级别评估上述级别的任何参数,但这都是< / LI>
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运算符分配内存空间来保存特定于新实例的实例变量和父实例变量。但是这个阶级之前已经进入了实体存在。