概括的说:静态代码块在类加载时调用,并且只调用一次。

静态代码块最常用的作用就是:给一个对象的属性初始化。

具体的说:

1.当调用一个类的静态变量时,这个类中的静态代码块会执行。【只有静态代码块会执行】


2.当调用一个 类的静态方法时,这个类中的静态代码块会执行。【只有静态代码块会执行】


3.当创建一个 类的一个实例时,这个类中的静态代码块、非静态代码块(也叫构造代码块)、创建实例的相应的构造方法都会执行。

//示例代码如下:

 package com.qls.test;


/**


 * 在创建Test6的一个实例时:即Test6 test6=new Test6();


 * 调用的顺序依次是:静态代码块、非静态代码块、构造方法。并且静态代码块只运行依次。


 * 每创建一个Test6实例,非静态代码块、构造方法都会执行。这与静态代码块只执行一次是不同的。


 * @author 秦林森


 *


 */


public class Test6 {


/**


* 静态代码块


* @param args


*/


static{


System.out.println("Test6 static block");


}


/**


* 非静态代码块


* @param args


*/


{


System.out.println("Test6 non-static block");


}


/**


* 构造方法


* @param args


*/


public Test6() {


System.out.println("Test6 constructor with no arguments");


}


public Test6(String id){


System.out.println("Test6 constructor with one argument id"+ id);


}


public static int book=1;


public static  void sixi(){


System.out.println("static method");


}


 


public static void main(String[] args) {


// TODO Auto-generated method stub


/*new Test6();


System.out.println("*****************");


new Test6("1");*/


 


//System.out.println(Test6.book);//调用静态变量时,只有静态代码块会执行。


Test6.sixi();//在调用静态方法时,只有静态代码块会执行。

//Test6.class.getClassLoader().loadClass(Test6.class.getName());//在Test6下面的main方法写这个语句,静态代码块会执行,

//但是不在Test6这个类下面,这句话就不能让静态代码块执行。 


​//Class.forName​​(Test6.class.getName());//加载Test6时,只有静态代码块会执行。 


}


 


}/*Output:


Test6 static block


Test6 non-static block


Test6 constructor with no arguments


*****************


Test6 non-static block


Test6 constructor with one argument id1*///:~