2011-04-05 104 views
2

最近,我发现一个数组可以初始化如下:初始化Java数组

private static int[] _array = new int[4]; 

// An arbitrary amount of code 

{ 
    _array[0] = 10; 
    _array[1] = 20; 
    _array[2] = 30; 
    _array[3] = 40; 
} 

什么叫这种形式的初始化?它有什么限制?

回答

3

这是使用initializer block进行实例成员初始化,它看起来很像静态初始化,它将以static这个词作为前缀。

由于Java编译器将初始化块复制到每个构造函数中,因此它的限制将与任何构造函数的限制相匹配。因此,这种方法可以用来在多个构造函数之间共享一段代码。

+3

另外值得一提的是,这似乎是一个非常危险方法初始化由** static **变量引用的数组。每次创建新实例时,数组的先前内容都将丢失,并重新初始化为一组新值。如果这是可取的,那么'_array'应该可能是一个实例成员。 – 2011-04-05 21:23:58

+0

@Mark Pardon我的好奇心,但是“成员初始化”和“静态初始化”之间的区别仅仅是在每个构造函数中为每个新实例调用成员初始化,而静态初始化只被调用过一次? – 2011-04-05 21:31:11

+0

@ T.K。:从语义上讲,类加载器每次加载类时都会运行一次静态初始化程序。在大多数情况下,这只意味着一次。 – 2011-04-05 21:32:41

1

这是初始化块和关于对documentation

Java编译器副本初始化 块到每一个构造函数。 因此,这种方法可用于 共享的代码 多个构造

我已经回答了昨天之间的块类似的帖子here