changefun
V2EX  ›  Java

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

  •  
  •   changefun · Jun 21, 2018 · 3617 views
    This topic created in 2907 days ago, the information mentioned may be changed or developed.

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

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

    1 创建对象时需要 jvm 将对应的类加载到内存中,加载类的过程中有个“ 2.2 链接-准备”阶段, “准备”这个阶段会为这个类对象分配内存,根据成员变量类型分配好每个成员变量需要的空间大小,此时针对成员变量进行初始化,根据变量类型分配对应大小的空间,并初始化默认值。
    2 而后的一个过程是“ 3 初始化”, 这个时候才调用类构造器<cinit>().
    8rB61FLBPVSxW2C8
        6
    8rB61FLBPVSxW2C8  
       Jun 21, 2018 via Android
    五楼正解。建议看 深入理解 java 虚拟机。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2823 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 68ms · UTC 13:14 · PVG 21:14 · LAX 06:14 · JFK 09:14
    ♥ Do have faith in what you're doing.