静态代码块非静态代码块(普通代码块)和构造方法的执行顺序
Posted lzf2017
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了静态代码块非静态代码块(普通代码块)和构造方法的执行顺序相关的知识,希望对你有一定的参考价值。
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 }
多次创建对象,静态代码块只执行一次,且最先执行。
接下来执行的是非静态语句代码块(即:普通代码块) ,会每创建一个对象执行一次,且多个非静态语句代码块会由上到下的执行。
在接下来执行的是构造方法,构造方法也是每创建一个对象就会执行一次。
在接下来就是调用普通的方法中的代码块,执行的顺序,在方法中没有什么特殊的。
对于静态属性,与静态代码块一样,也是在类加载时就会被自动执行,属于整个类的属性。
静态方法只能访问静态属性,一定不能访问非静态属性,但是注意这种说法的与我们通过对象来访问该静态属性,就是 对象名.非静态属性变量名, 这种方式就是我们通常在main方法中的一种访问方式。 这种访问的方式是可以的,但不能直接非静态属性变量名或静态属性方法。
对于静态方法中也不能直接使用this对象。
静态代码块是属于类的,在JVM加载类时就自动执行。静态代码块定义时不能添加作用域符。
以上是关于静态代码块非静态代码块(普通代码块)和构造方法的执行顺序的主要内容,如果未能解决你的问题,请参考以下文章