2012-04-18 128 views
0

我不确定我的头脑中是否有正确的Java初始化机制模型。每类遵循以下几点:静态成员java初始化顺序

  1. 初始化父类,如果存在一个
  2. 自己初始化

初始化遵循以下几点:

  1. 初始化静态和实例变量,有自己的价值观设置在初始化程序之外。
  2. 运行静态初始化块
  3. 运行的构造块

是不是准确/正确吗?

+1

有一个在初始化对象和加载类的差。静态成员在类加载时被初始化,而非静态成员在创建对象时被初始化。 – scravy 2012-04-18 16:08:07

+0

要小心你说的“初始化” – UmNyobe 2012-04-18 16:08:31

+0

可能是http://stackoverflow.com/questions/3499214/java-static-class-initialization的副本 – 2012-04-18 16:09:24

回答

1

代码执行如下 -

静态初始化块运行一次,在第一次加载类时。

静态变量

所有超级构造函数。

实例init块在构造函数调用super()后运行。

实例变量。

(初始化程序块执行在它们出现的顺序。)

+1

不能保证静态init块会在静态变量之前运行。事实上,许多静态变量(那些是final的并且具有编译时间常量表达式的)在静态初始化块之前分配。 – henko 2012-04-18 19:08:38

1

根据Java language specification,你的假设或多或少是正确的。例外情况是:当构造类(与构造函数一起)类初始化后

  1. 实例变量的运行,
  2. 最终静态编译时常量表达式的变量,甚至尝试之前加载加载超类,并且将静态初始化块与静态变量一起作为一个块按它们在代码中出现的顺序运行。
+0

我只是想写下来,我期望第1段 – 2012-04-18 16:16:08

+0

我会我也期望这一点,我刚才注意到,这个问题陈述了静态和实例变量在课堂建设之前一起初始化的假设。 – henko 2012-04-18 16:18:21