哪种机制负责Java中字段的初始初始化

哪种机制负责Java中字段的初始初始化,java,Java,据我们所知,Java对象的字段是这样初始化的: 布尔变量getfalse 其他基元类型(如int、byte、long)获取0 对象获取null 我的问题是哪个机制(方法)在做这项工作,它什么时候做这项工作?这些初始化是在JVM创建类的新实例时完成的。见第节。它说: 每当创建新的类实例时,都会分配内存空间 对于它,类中声明的所有实例变量都有空间 类型的每个超类中声明的所有实例变量 类类型,包括所有可能隐藏的实例变量 (§8.3) 如果没有足够的可用空间为 对象,然后使用 OutOfMemory

据我们所知,Java对象的字段是这样初始化的:

  • 布尔变量get
    false
  • 其他基元类型(如int、byte、long)获取
    0
  • 对象获取
    null

我的问题是哪个机制(方法)在做这项工作,它什么时候做这项工作?

这些初始化是在JVM创建类的新实例时完成的。见第节。它说:

每当创建新的类实例时,都会分配内存空间 对于它,类中声明的所有实例变量都有空间 类型的每个超类中声明的所有实例变量 类类型,包括所有可能隐藏的实例变量 (§8.3)

如果没有足够的可用空间为 对象,然后使用 OutOfMemoryError。否则,新 对象(包括在超类中声明的对象)初始化为 其默认值(§4.12.5)

对于每种类型的实例变量,默认值如下所示:

  • 对于类型
    byte
    ,默认值为零,即
    (byte)0
    的值
  • 对于类型
    short
    ,默认值为零,即
    (short)0
    的值
  • 对于类型
    int
    ,默认值为零,即
    0
  • 对于类型
    long
    ,默认值为零,即
    0L
  • 对于类型
    float
    ,默认值为正零,即
    0.0f
  • 对于类型
    double
    ,默认值为正零,即
    0.0d
  • 对于类型
    char
    ,默认值为空字符,即
    '\u0000'
  • 对于类型
    boolean
    ,默认值为
    false
  • 对于所有
    参考类型
    (§4.3),默认值为
    null

因此,它的
new
关键字似乎使JVM试图创建所选类的新对象,方法是分配该对象(及其超类、超类等)所需的空间,并将字段值设置为“零”。然后在构造函数中初始化为“正确”值。我误解了什么吗?@Pshemo关键字
new
是创建对象的方法之一。正是对象的创建使得JVM能够分配所需的空间,并将字段的值设置为
default
。是的,你的话是正确的:
构造函数
实例初始值设定项
@ArtyMathJava:不,是
创建新对象
做的。@VishalK哦,你是对的,我忘记了其他方法,比如反序列化。谢谢你的澄清。不幸的是,我不能给你超过+1的票数。@Pshemo:虽然反序列化对象是从字节流反序列化到内存中的实时实体,因此,分配默认值和执行要反序列化的对象的实例初始化和构造函数不会发生