Java初始化变量是否为null?

Java初始化变量是否为null?,java,initialization,primitive-types,Java,Initialization,Primitive Types,我想知道是否应该用初始值初始化java中的类成员,然后在构造函数中将该值更改为其他给定值,还是应该避免这样做 代码示例 public class Test { private int value = 5; public Test(int value) { this.value = value; } } 堆上未初始化的int始终为0。它不可能是空的。注意:在方法中,它必须初始化,而不仅仅是声明。如果未指定,则: 原语bytes、shorts、ints、long

我想知道是否应该用初始值初始化java中的类成员,然后在构造函数中将该值更改为其他给定值,还是应该避免这样做

代码示例

public class Test {
    private int value = 5;

    public Test(int value) {
        this.value = value;
 }
}

堆上未初始化的int始终为0。它不可能是空的。注意:在方法中,它必须初始化,而不仅仅是声明。

如果未指定,则:

原语
byte
s、
short
s、
int
s、
long
s、
float
s和
double
s初始化为0

boolean
s被初始化为false


对象被初始化为null

首先,不能使用
null
初始化
int
值。
int
的默认值为零,但是在字段声明和构造函数中初始化它是没有意义的。假设编译器没有完全省略字段初始值设定项,它会有效地编译为:

public class Test {
    private int value;

    public Test(int value) {
        this.value = /* field initializer value */;
        this.value = value;
    }
}
除非要使用非默认值(非零、非空)初始化字段,否则通常没有理由添加初始值设定项。如果初始值设定项是冗余的,这一点尤其正确,如上所述。字段的默认值是字段类型的“调零”值,例如,对于数字类型为
0
,对于布尔值为
false
,对于对象为
null
。请注意,对于字段有一个例外:
final
字段必须有一个初始值设定项,如果它们不是在每个构造函数中都指定一次<代码>最终字段没有隐含的默认值


现在,可能需要初始化方法变量,以确保在读取它们时它们具有值,因为变量不像字段那样具有默认/隐含的初始值设定项。是否需要显式初始值设定项取决于方法的控制流。

如果我们讨论的是类字段,那么

  • 基本类型设置为
    • 0
      (如
      int
      long
      double
      …)等数字项)
    • \u0000
      char
    • false
      boolean
  • 对象类型如
    String
    Integer
    AnyOtherClass
    被设置为
    null
所以实际上,如果你显式地设置它并不重要,因为

private int x;    
private Integer y;
相当于

private int x = 0;    
private Integer y = null;

Java提供值类变量,我的意思是它们由JVM初始化,您可以使用它们。但您必须搜索它们的默认值才能正确使用它们


另一方面,JVM不初始化在方法中创建的局部变量。因此,如果您在方法上创建任何变量,您必须在使用它们之前将它们赋给一个值。

An
int
不能为
null
。有关字段初始化的信息,请参见java规范:您也可以看到这一点:更不用说初始化为
0.0
的原语
float
double
,请正确更新它;) 字节、短字节、整数和长字节初始化为0。float和double初始化为0.0(0和0.0之间存在差异(至少对于浮点类型)。char也是一个原语,其初始值为
\u0000
。欢迎继续!在你的回答中,你提到了另一个答案。请注意,“上面”和“下面”可能随时发生变化,因此,如果您希望在答案中添加内容,您应该对其进行评论,而不是在添加内容的同时发布新答案。不过,要评论一个答案,你需要先获得一些声誉。