概念
- 概括的说:静态代码块在类加载时调用,并且只调用一次。
- 静态代码块最常用的作用就是:给一个对象的属性初始化。
具体的说:
1、当调用一个 类的静态变量
时,这个类中的静态代码块会执行。【只有静态代码块会执行】
2、当调用一个 类的静态方法
时,这个类中的静态代码块会执行。【只有静态代码块会执行】
3、当创建一个 类的一个实例
时,这个类中的静态代码块、非静态代码块(也叫构造代码块)、创建实例的相应的构造方法都会执行。
测试代码
package demo01;
/**
* 在创建Test06的一个实例时:即Test06 test06=new Test06();
* 调用的顺序依次是:静态代码块、非静态代码块、构造方法。并且静态代码块只运行依次。
* 每创建一个Test06实例,非静态代码块、构造方法都会执行。这与静态代码块只执行一次是不同的。
*/
public class Test06 {
/**
* 静态代码块
*/
static{
System.out.println("Test06 static block");
}
/**
* 非静态代码块
*/
{
System.out.println("Test06 non-static block");
}
/**
* 构造方法
*/
public Test06() {
System.out.println("Test06 constructor with no arguments");
}
public Test06(String id){
System.out.println("Test06 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) throws ClassNotFoundException {
//当创建一个 `类的一个实例` 时,这个类中的静态代码块、非静态代码块(也叫构造代码块)、创建实例的相应的构造方法都会执行
System.out.println("*****************");
// new Test06();
// System.out.println("*****************");
// new Test06("1");
//调用静态变量时,只有静态代码块会执行
// System.out.println(Test06.book);
//在调用静态方法时,只有静态代码块会执行
// Test06.sixi();
//在Test06下面的main方法写这个语句,静态代码块会执行,但是不在Test06这个类下面,这句话就不能让静态代码块执行
// Test06.class.getClassLoader().loadClass(Test06.class.getName());
Class<Test06> test06Class = Test06.class;
//加载Test06时,只有静态代码块会执行
// Class.forName(Test06.class.getName());
}
}