最近忙着投简历找工作,当然得为笔试面试准备一下,把以前学习时欠下的帐补回来。因为当初学Java、Jsp、J2EE课程时都是会用了能做出东西来就行的心态,没有做过笔记,现在很多基础的东西都忘了,哎。从今往后,尽可能把学过的东西都整理成博客,方便复习总结。
记得以前笔试时有一题是问Java的类初始化时static语句块和构造函数的执行顺序和次数的,当时答对了但是心里拿不准,今天查查资料顺便写个小例子巩固一下。
1 public class Test1 { 2 public static int X=100; 3 public final static int Y=200; 4 public Test1(){ 5 System.out.println("Test构造函数执行"); 6 } 7 static{ 8 System.out.println("static语句块执行"); 9 } 10 11 { 12 System.out.println("not static 语句块执行"); 13 } 14 15 public static void display(){ 16 System.out.println("静态方法被执行"); 17 } 18 public void display_1(){ 19 System.out.println("实例方法被执行"); 20 } 21 22 public static void main(String [] args){ 23 Test1.display(); 24 System.out.println("x=" + Test1.X + " y=" + Test1.Y ); 25 Test1.display(); 26 Test1 t1 = new Test1(); 27 Test1 t2 = new Test1(); 28 System.out.println("X=" + t1.X + " Y=" + t1.Y); 29 Test1.display(); 30 } 31 }
运行结果
static语句块执行 静态方法被执行 x=100 y=200 静态方法被执行 not static 语句块执行 Test构造函数执行 not static 语句块执行 Test构造函数执行 X=100 Y=200 静态方法被执行
可以看出static代码块是在类加载时自动执行的且只执行一次,非静态代码块在创建对象自动执行的代码,不创建对象不执行该类的非静态代码块。 顺序为 静态代码块--》非静态代码块--》类构造方法。第一次创建类实例、调用静态方法、访问静态变量或使用用Class.forName()显示加载类的时候都会执行static语句块。另外有多个static语句块时按顺序执行。
如在第一个static语句块之后再添加一个static语句块
static{ System.out.println("static语句块执行"); } static{ System.out.println("static222语句块执行"); }
则运行结果为
static语句块执行 static222语句块执行 静态方法被执行 x=100 y=200