在android源代码中我看到他们定义了四个变量
protected int mPaddingRight = 0;
protected int mPaddingLeft = 0;
protected int mPaddingTop;
protected int mPaddingBottom;
在Java中,将变量初始化为0与不初始化有什么区别?我不明白,在某些编译器中,除非初始化该字段,否则我无法进行比较。但这里的情况并非如此。这和优化有关系吗?或者这只是不一致/糟糕的编码实践?
根据Java基本数据类型教程:当声明字段时未初始化,编译器将分配一个合理的默认值。通常,根据数据类型,此默认值为零或 null。
byte 0
short 0
int 0
long 0L
float 0.0f
double 0.0d
char '\u0000'
String (or any object) null
boolean false
一个好的做法:在使用值之前初始化它们以防止意外行为。
局部变量在使用前必须初始化。
class Main {
public static void main(String[] args) {
int x;
System.out.println(x);
}
}
此代码无法编译。但是实例变量(或类,如果它们是
static
)具有默认值。
初始化变量是一个很好的编码习惯。
来自 Oracle 文档:
声明字段时并不总是需要赋值。 已声明但未初始化的字段将被设置为 编译器的合理默认值。一般来说,这个默认 将为零或空,具体取决于数据类型。依靠这样的 然而,默认值通常被认为是糟糕的编程 风格。
初始化变量的好处如下:
正如评论中所述,没有区别。它们将被隐式初始化为 0。但是,如果您使用好的 IDE 或有其他工具,那么您可以很容易地搜索并用
= 0;
替换 = SomeOtherValueHere;
。
此外,我认为在访问变量之前始终初始化变量是一个很好的做法。
其他人指出类属性已为您初始化为默认值。
因此,从语义上讲,如果将它们显式设置为 0(或者,对于对象属性,将它们设置为 null。)
但是,实际上字节码级别可能存在差异。无法保证仅隐式与显式设置为默认值的类属性不同的代码将具有完全相同的字节码。
旧版本的 JDK 用于生成更大更长的代码以进行显式初始化,这很容易使用
javap
检查。 (这个事实偶尔被用作面试问题的基础。)我还没有检查最新版本的 JDK 来看看情况是否仍然如此。