类被创建之后的成员的初始化顺序到底是怎么样的?
首先 不考虑继承
package com; public class DemoOne { /** * 关于类的初始化顺序 */ //不考虑继承结构的情况 private static int a; private String str="我被赋值了"; { System.out.println("3 进入代码块中 str ===="+ str); System.out.println("4 进到普通代码块"); } static{ System.out.println("1 静态代码块 a==="+a); //此时a 已经有了初始值0 说明 静态变量在静态代码块之前执行 原因是代码的前后顺序 // 编译报错 System.out.println("str ===="+ str); System.out.println("2 进入静态代码块"); } public DemoOne(){ System.out.println("5 进入构造器"); System.out.println(" 构造器中 str===="+str); System.out.println("a===="+a); } public static void main(String[] args) { new DemoOne(); } }
运行程序后输出结果为:
1 静态代码块 a===0
2 进入静态代码块
3 代码块中 str ====我被赋值了
4 进到普通代码块
5 进入构造器
构造器中 str====我被赋值了
a====0
为了验证静态成员的顺序由代码的前后顺序决定 讲静态变量和静态块顺序调整
package com; public class DemoOne { /** * 关于类的初始化顺序 */ //不考虑继承结构的情况 static{ // 编译报错 System.out.println("str ===="+ str); System.out.println("1 进入第一个静态代码块"); } private static int a; static{ System.out.println("2 进入第二个静态块 a===="+a); } private String str="我被赋值了"; { System.out.println("3 进入代码块中 str ===="+ str); System.out.println("4 进到普通代码块"); } public DemoOne(){ System.out.println("5 进入构造器"); System.out.println(" 构造器中 str===="+str); System.out.println("a===="+a); } public static void main(String[] args) { new DemoOne(); } }
输出结果为:
1 进入第一个静态代码块
2 进入第二个静态块 a====0
3 进入代码块中 str ====我被赋值了
4 进到普通代码块
5 进入构造器
构造器中 str====我被赋值了
a====0
由输出结果可以看到 调整顺序后的静态块和静态变量先后顺序发生改变