关于Java中初始化块的一些问题

时间:2010-04-24 04:20:04

标签: java

  1. 你在哪里主要使用初始化块?
  2. 您可以使用它们为静态实例变量赋值吗?
  3. 这与使用构造函数分配有什么不同?
  4. 我的书说在“加载类”时执行初始化块。加载一个类意味着什么?
  5. 附加问题  哪个更好?

    class {static final instance-variable = val} 
    

    class {static final instance-variable;  static {instance-variable=val}}
    

2 个答案:

答案 0 :(得分:4)

无论您想要使用的构造函数是什么,初始化块总是被称为。因此,如果有问题的类有多个构造函数,并且您想要运行某些代码而不管使用的构造函数,那么使用初始化块。

但是,当用于指定默认值时,我只是直接指定它们。如果它们甚至是常量,那么我也会将final添加到修饰符列表中。

private static final String VAL1 = "VALUE";

更新,因为您彻底改变了问题,这是一个更新的答案:

  

1)你在哪里主要使用初始化块?

无论使用何种构造函数,都要执行一些代码。

  

2)您可以使用它们为静态实例变量赋值吗?

您需要一个static初始化程序块。

private static final String FOO;

static {
    FOO = "bar";
}

这样做的好处是,您可以做的不仅仅是分配值。例如。从某种方法获取它并处理异常:

static {
    try {
        FOO = getItSomehow();
    } catch (Exception e) {
        throw new ExceptionInInitializerError(e);
    }
}
  

3)这与使用构造函数分配有什么不同?

无论使用何种构造函数,都会始终分配它。

  

4)我的书说在“加载类”时执行初始化块。加载一个类意味着什么?

这本书实际上是在谈论静态初始化块。当您在代码中第一次引用类时,通常会加载该类。您还可以通过Class#forName()强制加载它(例如您使用JDBC驱动程序)。我在here之前发布了更多示例和解释的答案。

希望这有帮助。

答案 1 :(得分:1)

  

附加问题哪个更好?

class {static final instance-variable = val} 
     

class {static final instance-variable;  static {instance-variable=val}}

他们有相同的行为。在这种情况下,第一种形式更好,因为它更简洁,更容易阅读。

如果初始化太复杂,则只使用静态初始化程序块,以便使用带有初始化表达式的一系列静态声明清楚地表达。