语法:
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成员方法
Process finished with exit code 0
说明:从运行结果可以看出:
静态代码块由始至终只运行了一次。
非静态代码块,每次创建对象的时候,会在构造方法之前运行。所以读取成员变量name时,只能获取到 String 类型的默认值“null”。
构造方法只有在使用
new
创建对象的时候才会运行。
成员方法只有在使用对象调用的时候才会运行。
因为name是static 修饰的静态成员变量,在创建s2对象时将字符串“s2”赋给了name,所以创建s3对象时,重新调用了类的非静态代码块,此时name的值还没有被s3对象改变,于是就会输出“s2非静态代码块”。