转:静态代码块、非静态代码块的执行顺序及小练习

原文: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
View Code

猜你喜欢

转载自www.cnblogs.com/lqywong/p/10828523.html