首页 > 代码库 > 静态代码块、非静态代码块(普通代码块)和构造方法的执行顺序

静态代码块、非静态代码块(普通代码块)和构造方法的执行顺序

Java中经常有一些静态块,这是用来在生成类之前进行的初始化,无论java还C++语言中的static,都是最先初始化好的。结构如下: 
static { 
静态语句代码块 



非静态语句代码块 

 
相同点:都是在JVM加载类时且在构造方法执行之前执行,在类中都可以定义多个,一般在代码块中对一些static变量进行赋值。 
不同点:静态代码块在非静态代码块之前执行(静态代码块-->非静态代码块-->构造函数)。 

 

技术分享
 1 public class Test_Static_Class {  
 2     //静态代码块  
 3     static {  
 4          
 5        System.out.println("静态代码块");  
 6    }  
 7    {  
 8        System.out.println("普通代码块1");  
 9    }  
10    
11    public   Test_Static_Class() {  
12        System.out.println("执行了构造方法");  
13 }  
14    //普通的成员方法  
15    public void test() {  
16        System.out.println("在方法中的普通代码块");  
17        //普通的代码块  
18        {  
19            System.out.println("普通代码块");  
20        }  
21         
22 }  
23    public static void main(String[] args) {  
24     System.out.println("执行了主方法");  
25     System.out.println("--------------------");  
26     new Test_Static_Class();  
27     System.out.println("------第二次创建对象---------------");  
28     new Test_Static_Class();  
29     System.out.println("------第三次创建对象---------------");  
30     new Test_Static_Class().test();  
31 }  
32    
33    {  
34        System.out.println("普通代码块2");  
35    }  
36 }  
View Code

 

多次创建对象,静态代码块只执行一次,且最先执行

接下来执行的是非静态语句代码块(即:普通代码块) ,会每创建一个对象执行一次,且多个非静态语句代码块会由上到下的执行。

在接下来执行的是构造方法,构造方法也是每创建一个对象就会执行一次

在接下来就是调用普通的方法中的代码块,执行的顺序,在方法中没有什么特殊的。

对于静态属性,与静态代码块一样,也是在类加载时就会被自动执行,属于整个类的属性。

静态方法只能访问静态属性,一定不能访问非静态属性,但是注意这种说法的与我们通过对象来访问该静态属性,就是 对象名.非静态属性变量名, 这种方式就是我们通常在main方法中的一种访问方式。 这种访问的方式是可以的,但不能直接非静态属性变量名或静态属性方法。

对于静态方法中也不能直接使用this对象。


静态代码块是属于类的,在JVM加载类时就自动执行。静态代码块定义时不能添加作用域符。

 

静态代码块、非静态代码块(普通代码块)和构造方法的执行顺序