V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
changefun
V2EX  ›  Java

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

  •  
  •   changefun · 2018-06-21 09:57:00 +08:00 · 3003 次点击
    这是一个创建于 2350 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    1 创建对象时需要 jvm 将对应的类加载到内存中,加载类的过程中有个“ 2.2 链接-准备”阶段, “准备”这个阶段会为这个类对象分配内存,根据成员变量类型分配好每个成员变量需要的空间大小,此时针对成员变量进行初始化,根据变量类型分配对应大小的空间,并初始化默认值。
    2 而后的一个过程是“ 3 初始化”, 这个时候才调用类构造器<cinit>().
    HackerOO7
        6
    HackerOO7  
       2018-06-21 14:34:24 +08:00 via Android
    五楼正解。建议看 深入理解 java 虚拟机。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5860 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 02:37 · PVG 10:37 · LAX 18:37 · JFK 21:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.