相同点: 都是在JVM加载类时且在构造方法执行之前执行,在类中都可以定义多个,定义多个时按定义的顺序执行,一般在代码块中对一些static变量进行赋值。
不同点: 静态代码块在非静态代码块之前执行(静态代码块 -> 非静态代码块 -> 构造方法)。静态代码块只在第一次new执行一次,之后不再执行,而非静态代码块在每new一次就执行一次。 非静态代码块可在普通方法中定义(不过作用不大);而静态代码块不行。
修正 issue #677:静态代码块可能在第一次new的时候执行,但不一定只在第一次new的时候执行。比如通过
Class.forName("ClassDemo")
创建 Class 对象的时候也会执行。
一般情况下,如果有些代码比如一些项目最常用的变量或对象必须在项目启动的时候就执行的时候,需要使用静态代码块,这种代码是主动执行的。如果我们想要设计不需要创建对象就可以调用类中的方法,例如:Arrays类,Character类,String类等,就需要使用静态方法, 两者的区别是 静态代码块是自动执行的而静态方法是被调用的时候才执行的.
Example:
1 public class Test { 2 public Test() { 3 System.out.print("默认构造方法!--"); 4 } 5 6 //非静态代码块 7 { 8 System.out.print("非静态代码块!--"); 9 } 10 11 //静态代码块 12 static { 13 System.out.print("静态代码块!--"); 14 } 15 16 private static void test() { 17 System.out.print("静态方法中的内容! --"); 18 { 19 System.out.print("静态方法中的代码块!--"); 20 } 21 22 } 23 24 public static void main(String[] args) { 25 Test test = new Test(); 26 Test.test();//静态代码块!--静态方法中的内容! --静态方法中的代码块!-- 27 } 28 }
上述代码输出:
静态代码块!--非静态代码块!--默认构造方法!--静态方法中的内容! --静态方法中的代码块!--
当只执行 Test.test();
时输出:
静态代码块!--静态方法中的内容! --静态方法中的代码块!--
当只执行 Test test = new Test();
时输出:
静态代码块!--非静态代码块!--默认构造方法!--
非静态代码块与构造函数的区别是: 非静态代码块是给所有对象进行统一初始化,而构造函数是给对应的对象初始化,因为构造函数是可以多个的,运行哪个构造函数就会建立什么样的对象,但无论建立哪个对象,都会先执行相同的构造代码块。也就是说,构造代码块中定义的是不同对象共性的初始化内容。