`
fatherican
  • 浏览: 49432 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

java 类的初始化顺序

 
阅读更多

对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序以此是(静态变量、静态初始化块)>(变量、初始化块)>构造器。我们也可以通过下面的测试代码来验证这一点:

public class InitialOrderTest {

//静态变量

public static String staticField = "静态变量";

//变量

public String field = "变量";

//静态初始化块

static {

System.out.println(staticField);

System.out.println("静态初始化块");

}

//初始化块

{

System.out.println(field);

System.out.println("初始化块");

}

//构造器

public InitialOrderTest() {

System.out.println("构造器");

}

public static void main(String[] args) {

new InitialOrderTest();

}

}


运行以上代码,我们会得到如下的输出结果:

1静态变量

2静态初始化块

3变量

4初始化块

5构造器

这与上文中说的完全符合。那么对于继承情况下又会怎样呢?我们仍然以一段测试代码来获取最终结果:

class Parent {

//静态变量

public static String p_StaticField = "父类--静态变量";

//变量

public String p_Field = "父类--变量";

//静态初始化块

static {

System.out.println(p_StaticField);

System.out.println("父类--静态初始化块");

}

//初始化块

{

System.out.println(p_Field);

System.out.println("父类--初始化块");

}

//构造器

public Parent() {

System.out.println("父类--构造器");

}

}

public class SubClass extends Parent {

//静态变量

public static String s_StaticField = "子类--静态变量";

//变量

public String s_Field = "子类--变量";

//静态初始化块

static {

System.out.println(s_StaticField);

System.out.println("子类--静态初始化块");

}

//初始化块

{

System.out.println(s_Field);

System.out.println("子类--初始化块");

}

//构造器

public SubClass() {

System.out.println("子类--构造器");

}

//程序入口

public static void main(String[] args) {

new SubClass();

}

}

运行一下上面的代码,结果马上呈现在我们的眼前:

1父类--静态变量

2父类--静态初始化块

3子类--静态变量

4子类--静态初始化块

5父类--变量

6父类--初始化块

7父类--构造器

8子类--变量

9子类--初始化块

10子类--构造器

现在,结果已经不言自明了。大家可能会注意到一点,那就是,并不是父类完全初始化完毕后才进行子类的初始化,实际上子类的静态变量和静态初始化块的初始化是在父类的变量、初始化块和构造器初始化之前就完成了。

那么对于静态变量和静态初始化块之间、变量和初始化块之间的先后顺序又是怎样呢?是否静态变量总是先于静态初始化块,变量总是先于初始化块就被初始化了呢?实际上这取决于它们在类中出现的先后顺序。我们以静态变量和静态初始化块为例来进行说明。


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics