2016-04-26 71 views
6

在Android源代码,我看到他们定义四个变量将int初始化为0还是不?

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

在Java中,就是在初始化变量为0或不区别?我不明白,在一些编译器中,除非我初始化该字段,否则我无法进行比较。但这不是这种情况。这是否与优化有关?或者这只是不一致/不好的编码习惯?

+2

没有区别 - int成员默认初始化为零。 –

+1

但是,如果我想让它们为0,我仍然会初始化为'0'。因为我这样做,你也应该! – Gendarme

回答

8

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

哇,很多很棒的答案。所以我挑选最古老的,并投票其他人。 –

1

正如在评论中指出,没有没有区别。他们将隐含地用0来初始化。但是,如果您使用良好的IDE或使用其他工具,那么使用= SomeOtherValueHere;搜索并替换= 0;会非常容易。

另外我认为这是一个很好的做法,总是初始化您的变量,然后再访问它们。

1

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

对于Oracle文档:

它并不总是必要的,当某个字段声明分配一个值。 已声明但未初始化的字段将被编译器设置为 合理的默认值。一般来说,根据数据类型的不同,默认的 将为零或为空。然而,依靠这样的 默认值,一般认为编程风格不好 。

初始化是如下的变量的好处:

  1. 使得它更容易跟踪你的代码
  2. 使生活更轻松的静态分析工具。
  3. 大多数流行设计模式会要求您将变量初始化为默认值,以便程序员确切知道变量初始化的是哪个值。
  4. 初始化变量以防止稍后在程序中发生未定义的行为始终是一种良好的做法。
  5. 如果初始化变量,调试变得更容易。
+0

嗯。这里并不完全是“未定义的行为”。所有详细说明。静态分析工具也可以处理。 – Thilo

0

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

所以,语义,没有什么区别,如果你明确地将它们设置为0(或为对象的属性,设置这些为null)。

然而,实际上可能是在字节码水平的差异。不能保证仅在类属性中存在差异的代码隐含地与明确地设置为默认值将具有完全相同的字节代码。

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

+0

至于你是否应该以这种方式初始化类属性,即使是已知的默认值,这也是踏入圣战的领土。我的感觉是明确的默认初始化器是噪声,应该省略。如果一个属性需要一个非默认的初始化方法,并且设计不需要静态初始化方法或构造方法(无论出于何种原因),那么只要有关于为什么使用魔术值的注释就可以做到这一点。尽管如此,我所从事的每一家Java商店都从未这么做过。那些C#开发者,但是,他们初始化_everything_。 – jdv

+0

更明确的初始化代码?我认为我知道Java:D –