我知道Java原语具有默认初始化值;例如0
的{{1}}。
从我的研究看来,我似乎不应该依赖这些价值观。我是否应该始终提供显式初始化,如果是,请在哪里?
这是我的计划的一部分:
int
答案 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原语初始化。
假设你有这门课程:
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)
默认值是可靠的。
实际上,它们比显式归零更“可靠”,因为默认分配在所有其他操作之前发生。