原语的显式初始化

时间:2013-06-20 17:13:58

标签: java initialization

我知道Java原语具有默认初始化值;例如0的{​​{1}}。

从我的研究看来,我似乎不应该依赖这些价值观。我是否应该始终提供显式初始化,如果是,请在哪里?

这是我的计划的一部分:

int

7 个答案:

答案 0 :(得分:4)

使用Java生成的默认值绝对没问题,您无需显式初始化static的实例或class字段。 Java语言规范要求这样,因此语言的任何实现都必须符合。换句话说,如果使用成员变量的默认值,则代码将保持100%可移植。这适用于基本类型和引用类型(后者用null初始化)。

有关详细信息,请参阅第81页的Java Language Specification

  

4.12.5变量的初始值

     

程序中的每个变量在使用其值之前必须具有值:    - 使用a初始化每个类变量,实例变量或数组组件   创建时的默认值

您必须提供显式初始化的唯一情况是声明局部变量:

  

在使用初始化或赋值之前,必须在使用本地变量之前显式赋予它一个值,并且可以使用明确赋值的规则进行验证。

但是,由于无法初始化本地是编译时错误,编译器将在您运行程序之前查明每个缺少的初始化。

答案 1 :(得分:1)

  

从我的研究看来,我似乎不应该依赖这些价值观。

你可以依靠它们。没有任何伤害,因为您已经知道默认情况下这样做。

  

我是否应该始终提供显式初始化,如果是,请在哪里?

对于原语,没有必要提供显式初始化,我不愿意。我很少这样做并且看到人们像实例变量一样进行初始化 - int i = 0;。但是,如果你在谈论局部变量,那么你需要给它们明确的值。默认值不是隐含的。

但是当案例出现在非原语时,那么你应该在声明点或构造函数内部进行显式初始化,因为值默认为null,这可能导致{ {1}},如果不加以照顾。在声明时初始化的好处是,您不必在每个构造函数中进行初始化。

答案 2 :(得分:0)

如果您真的担心这个,请在​​构造函数中初始化变量。但是,我从未见过将数字原语初始化为零以外的任何东西。

如果您正在使用一些自定义(和差)JVM,我认为您只需要担心这一点。

答案 3 :(得分:0)

成员变量将使用默认值进行初始化。所以你不必担心。但是如果你想用默认值或其他值初始化,你可以在构造函数

中设置它们

答案 4 :(得分:0)

作为一般规则,您编写的代码应始终做最不可能的事情。如果您认为未明确初始化的变量的默认值为零,那么您可能应该确保始终分配初始值,即使它是零。

我在您展示的代码中的个人偏好是在声明时将变量初始化为0。这只是因为对变量的第一个操作是+=,对我而言,依赖于数值运算的默认值是错误的。这没有充分的理由,因为它只会感觉不对,所以它会正常工作。

答案 5 :(得分:0)

您可以使用默认值清楚地信任JVM原语初始化。


BTW,显式初始化将被转换为字节码,在这种情况下无用。

假设你有这门课程:

public class PrimitiveInitialization {
    int i = 0;
    int j;
}

相应的字节码将是

class PrimitiveInitialization {
  I i
  I j

  public <init>()V
   L0
    LINENUMBER 8 L0
    ALOAD 0
    INVOKESPECIAL java/lang/Object.<init> ()V
   L1
    LINENUMBER 10 L1
    ALOAD 0
    ICONST_0
    PUTFIELD PrimitiveInitialization.i : I
    RETURN
   L2
    LOCALVARIABLE this LPrimitiveInitialization; L0 L2 0
    MAXSTACK = 2
    MAXLOCALS = 1
}

我们可以看到显式初始化为变量i添加了少量字节码操作。

那就是说,你必须总是更喜欢代码可读性,因为JIT可能会在运行时优化这种字节码。

答案 6 :(得分:0)

默认值是可靠的。


实际上,它们比显式归零更“可靠”,因为默认分配在所有其他操作之前发生。