[ Java ]实例化对象时,实例成员变量的默认初始化工作是在构造方法内完成的么?

2018-06-21 09:57:00 +08:00
 changefun

网上的答案说创建对象时,成员变量如果没有显式赋值,则默认初始化为对应的值,如整型默认 0,String 默认 null 等等。这里的 0 和 null 是在哪里赋值给成员变量的? google 搜到一个答案说是在构造方法默认给成员变量赋初始值的。

class A{
      public String n;
      
      public A(){
           this.n = null; // 如果 n 没有被显式赋值,这里被 JVM 默认添加赋值语句???
      }
}
2893 次点击
所在节点    Java
6 条回复
vjnjc
2018-06-21 10:16:05 +08:00
不是太清楚,感觉是构造函数跑完就给初始值了
ccccyu
2018-06-21 10:43:03 +08:00
JVM 在给对象分配内存空间时,会把所有内存空间都初始化为零值,这里的 null,0 就是其体现,而不是主动赋值产生的。分配完内存空间之后才会执行构造方法,按你的想法对字段进行赋值。参考深入理解 Java 虚拟机。
sakudie
2018-06-21 10:50:11 +08:00
成员变量的初始化 先于 构造器的初始化
BBCCBB
2018-06-21 11:26:29 +08:00
你断点调一下不就得了吗
promise2mm
2018-06-21 11:45:43 +08:00
类加载过程:1 加载 -> 2 链接( 2.1 验证,2.2 准备,2.3 解析) -> 3 初始化 -> 4 使用 -> 5 卸载

1 创建对象时需要 jvm 将对应的类加载到内存中,加载类的过程中有个“ 2.2 链接-准备”阶段, “准备”这个阶段会为这个类对象分配内存,根据成员变量类型分配好每个成员变量需要的空间大小,此时针对成员变量进行初始化,根据变量类型分配对应大小的空间,并初始化默认值。
2 而后的一个过程是“ 3 初始化”, 这个时候才调用类构造器<cinit>().
HackerOO7
2018-06-21 14:34:24 +08:00
五楼正解。建议看 深入理解 java 虚拟机。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/464613

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX