在类的成员方法之外,用static修饰代码区域可以称之为静态代码块。定义一块静态代码块,可以完成类的初始化操作,在类的声明时就会运行。
语法如下:
public class StaticTest{
static{
//执行语句
}
}
以下示例为说明静态代码块、非静态代码块、构造方法、成员方法的调用顺序
public class StaticTest{
static String name;
//静态代码块
static{
System.out.println(name+"静态代码块");
}
//非静态代码块
{
System.out.println(name+"非静态代码块");
}
//构造方法
public StaticTest(String a){
name=a;
System.out.println(name+"构造方法");
}
//成员方法
public void method(){
System.out.println(name+"成员方法");
}
public static void main(String[] args){
StaticTest s1;//声明时候就已经运行静态代码块
StaticTest s2=new StaticTest("s2");//new时候才会运行构造方法
StaticTest s3=new StaticTest("s3");
s3.method();//只有调用的时候才会运行
}
}
测试结果:
null静态代码块
null非静态代码块
s2构造方法
s2非静态代码块
s3构造方法
s3成员方法
说明如下:
- 静态代码块由始至终只运行一次
- 非静态代码块,每次创建对象的时候,会在构造方法之前运行。所以读取name时,只获取到String类型的默认值null
- 构造方法只有在使用new创建对象时候才会运行
- 成员方法只有在使用对象调用的时候才会运行
- 因为name是static修饰的静态成员变量,创建s2对象时将字符串“s2”赋值给name,所以创建s3对象时,重新调用类的非静态代码块,此时name的值还没有被s3对象改变,因此才输出“s2非静态代码块”