原文:https://blog.csdn.net/sinat_33921105/article/details/79509638
静态代码块的特点:随着类的加载而执行,而且只执行一次。
静态代码块先于main函数执行,因为静态代码块是随着类的加载而执行。
先看一个例子:
1 class StaticDemo{ 2 3 //静态代码块 4 static { 5 System.out.println("静态代码块被执行"); 6 } 7 8 void show(){ 9 System.out.println("方法被执行"); 10 } 11 12 } 13 14 public class StaticTest { 15 16 public static void main(String[] args){ 17 18 new StaticDemo().show(); 19 new StaticDemo().show(); 20 }
运行结果:
静态代码块被执行
方法被执行
方法被执行
静态代码块先于main函数执行,因为静态代码块是随着类的加载而执行。
例子2:
1 public class StaticTest { 2 3 static { 4 5 System.out.println("a"); 6 } 7 8 public static void main(String[] hq){ 9 10 System.out.println("b"); 11 } 12 13 14 }
运行结果:
a
b
加入继承后,例子3:
1 class StaticDemo{ 2 3 //静态代码块 4 static { 5 System.out.println("父类静态代码块被执行"); 6 } 7 void show(){ 8 System.out.println("父类方法被执行"); 9 } 10 } 11 public class StaticTest extends StaticDemo { 12 13 /** 14 * 静态代码块的特点: 15 * 随着类的加载而执行,而且只执行一次 16 * 静态代码块额执行顺序优先于main函数 17 */ 18 19 20 static { 21 22 System.out.println("子类静态代码块被执行"); 23 } 24 25 void show(){ 26 System.out.println("子类方法被执行"); 27 } 28 29 public static void main(String[] hq){ 30 31 System.out.println("main函数"); 32 StaticTest staticTest = new StaticTest(); 33 34 } 35 }
运行结果:
父类静态代码块被执行
子类静态代码块被执行
main函数
加入非静态代码块和构造方法后,例子4:
1 class StaticDemo{ 2 3 //静态代码块 4 static { 5 System.out.println("父类静态代码块被执行"); 6 } 7 8 //非静态代码块 9 { 10 System.out.println("父类非静态代码块被执行"); 11 } 12 //构造方法 13 StaticDemo(){ 14 15 System.out.println("父类构造方法被执行"); 16 } 17 } 18 public class StaticTest extends StaticDemo { 19 20 /** 21 * 静态代码块的特点: 22 * 随着类的加载而执行,而且只执行一次 23 * 静态代码块额执行顺序优先于main函数 24 */ 25 static { 26 27 System.out.println("子类静态代码块被执行"); 28 } 29 //非静态代码块 30 { 31 System.out.println("子类非静态代码块被执行"); 32 } 33 StaticTest(){ 34 System.out.println("子类构造方法被执行"); 35 } 36 37 public static void main(String[] hq){ 38 System.out.println("main函数"); 39 new StaticTest(); 40 } 41 }
运行结果:
父类静态代码块被执行
子类静态代码块被执行
main函数
父类非静态代码块被执行
父类构造方法被执行
子类非静态代码块被执行
子类构造方法被执行
总结:
静态代码块会随着类的加载而执行,而且只执行一次。当new StaticTest()开始执行的时候会先去执行父类中的静态代码块,然后再执行子类中的静态代码块,当所有的静态代码块都执行结束后会执行main函数中的输出语句(前提是输出语句在new StaticTest()之前),然后会去执行父类中的非静态代码块,接着是父类中的构造方法,紧接着执行子类中的非静态代码块,最后是子类中的构造方法!
文末附上个网上看到的关于静态代码块的小练习
第二题答案:
1 1a2b2b