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