是否将int初始化为0?

Initialize int to 0 or not?

在 android 源代码中,我看到他们将四个变量定义为

protected int mPaddingRight = 0;
protected int mPaddingLeft = 0;
protected int mPaddingTop;
protected int mPaddingBottom;

在Java中,变量初始化为0和不初始化有什么区别?我不明白在某些编译器中,除非我初始化该字段,否则我无法进行比较。但这里不是这种情况。这与优化有关吗?或者这只是 inconsistent/bad 编码练习?

根据 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

如评论中所述,没有区别。它们将隐含地初始化为 0。但是如果你使用好的 IDE 或者有其他工具,你会很容易搜索并用 = SomeOtherValueHere; 替换 = 0;

此外,我认为在访问变量之前始终对其进行初始化是一种很好的做法。

初始化变量是一个很好的编码习惯。

来自 Oracle 文档:

It's not always necessary to assign a value when a field is declared. Fields that are declared but not initialized will be set to a reasonable default by the compiler. Generally speaking, this default will be zero or null, depending on the data type. Relying on such default values, however, is generally considered bad programming style.

初始化变量的好处如下:

  1. 更容易遵循您的代码
  2. 让静态分析工具的生活更轻松。
  3. 大多数流行的设计模式都要求您将变量初始化为默认值,以便程序员确切地知道变量被初始化为哪个值。
  4. 初始化变量以防止程序稍后出现未定义的行为始终是一个好习惯。
  5. 如果初始化变量,调试会变得更容易。

其他人指出 class 属性已为您初始化为默认值。

因此,从语义上讲,如果将它们显式设置为 0(或者,对于对象属性,将它们设置为 null),则没有区别。

但是,实际上在字节码级别可能存在差异。无法保证仅在 class 属性(隐式设置与显式设置为默认值)方面不同的代码将具有完全相同的字节码。

旧版本的 JDK 用于为显式初始化生成更大更长的代码,这很容易用 javap 进行检查。 (这个事实偶尔被用作面试问题的基础。)我还没有检查 JDK 的最新版本,看看是否仍然如此。

局部变量必须在使用前初始化。

class Main {
  public static void main(String[] args) {
    int x;
    System.out.println(x);
  }
}

此代码无法编译。但是实例变量(或 class,如果它们是 static)具有默认值。