java初始化代码块
java类中数据域的初始化有三种方式:
1.声明的同时初始化
2.构造器中进行初始化
3.在初始化块中做初始化
初始化代码块分为静态域代码块和实例域代码块,静态域代码块在类第一次被加载时被执行,实例域代码块在创建对象时被执行,一个类中可以多个代码块。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 public class ConstructorTest { 2 public static void main(String[] args) { 3 EmployeeTest employee=new EmployeeTest(); 4 5 System.out.println("employee name is " + employee.getName()); 6 Thread hook = new Thread() { 7 public void run() { 8 System.out.println("====================" ); 9 } 10 11 }; 12 13 System.out.println("--------------------" ); 14 System.out.println("employee name is " + employee.getName()); 15 Runtime.getRuntime().addShutdownHook(hook); 16 } 17 } 18 19 class EmployeeTest { 20 private static int nextId=0; //声明时初始化 21 22 private String name="无名氏"; //声明时初始化 23 24 static { 25 nextId = 3; //静态域代码块做初始化 26 System.out.println("静态域代码块调用1"); 27 } 28 29 static { 30 nextId = 5; //静态域代码块做初始化 31 System.out.println("静态域代码块调用2"); 32 } 33 34 { 35 name="张三"; //实例域代码块做初始化 36 System.out.println("创建类的实例时执行的代码块1"); 37 } 38 39 { 40 name="李四"; //实例域代码块做初始化 41 System.out.println("创建类的实例时执行的代码块2"); 42 } 43 44 public EmployeeTest() { 45 // TODO Auto-generated constructor stub 46 name="王五"; 47 System.out.println("构造器方法调用"); 48 } 49 50 public String getName() { 51 return name; 52 } 53 54 public void setName(String name) { 55 this.name = name; 56 } 57 58 59 public void finalize() { 60 System.out.println("finalize"); 61 } 62 63 public static void printNextId() { 64 System.out.println("nextId=" + nextId); 65 } 66 }
执行结果:
1 静态域代码块调用1 2 静态域代码块调用2 3 创建类的实例时执行的代码块1 4 创建类的实例时执行的代码块2 5 构造器方法调用 6 employee name is 王五 7 -------------------- 8 employee name is 王五 9 ====================