这两种初始化静态变量的方法有什么不同?

时间:2013-07-06 18:13:53

标签: java android static static-members

如果在Android应用程序中使用,以下两个示例之间有什么区别?

实施例1

public class ExampleClassOne {  
    public static int x = 9;
}

例2

public class ExampleClassTwo{   
  public static int x;
  static{   
      x = 9;    
  } 
}

4 个答案:

答案 0 :(得分:1)

对于这个例子,没有区别。这两种形式完全相同。 (实际上,我怀疑产生的字节码实际上是相同的。)

有些情况存在差异。或者更准确地说,你可以表达的是不同的。想到的一对夫妇是:

  • static初始化程序块可以处理异常(特别是已检查的异常)但初始化程序表达式不能处理。

  • static初始化程序块可以将静态初始化为任意复杂语句序列的结果,但初始化表达式仅限于您可以在单个表达式中计算的内容。

    < / LI>

话虽如此,我建议您尽可能使用更简单的初始化表达式表单。毫无疑问,它更具可读性。

答案 1 :(得分:0)

根据Oracle tutorial

public static int x = 9;

当初始化值可用且初始化可以放在一行时,这很有效。然而,这种形式的初始化由于其简单性而具有局限性。如果初始化需要一些逻辑(例如,错误处理或for循环来填充复杂的数组),那么简单的赋值就不够了。

可以在构造函数中初始化实例变量,可以使用错误处理或其他逻辑。为了为类变量提供相同的功能,Java编程语言包括静态初始化块。

编译器实际上做的是在内部生成一个单独的类初始化例程,它按照它们在类声明中出现的顺序组合所有静态变量初始化器和所有静态初始化器代码块。单个初始化过程仅在首次加载类时自动运行一次。

但在您的情况下,使用您的代码,它没有任何区别。

答案 2 :(得分:0)

通常static块用于更复杂的初始化,例如,如果您有List并希望填充它。

编辑(回滚;))在您的情况下初始化是等效的。

答案 3 :(得分:0)

它们都是相同的,并且会在类创建/启动时被调用和初始化。 没有这样的差异。