static{}的用法
static{} 静态代码块、{}非静态代码块、构造方法、成员方法:
静态代码块:静态代码块最先执行,静态代码块只在第一次new执行一次,之后不再执行
非静态代码块:在静态代码块之后执行,非静态代码块每new一次执行一次
构造方法:在非静态方法之后执行,在new的时候值被传入
成员方法:最后执行,只有在被手动调用的时候才会被执行
非静态代码块、构造方法、静态代码块、成员方法执行的先后顺序为:静态代码块、非静态代码块、构造方法、成员方法。
举个栗子:
public class StaticTest {
static String name;
public StaticTest(String a) {
name = a;
System.out.println(name + "构造方法");
}
{
System.out.println(name + "非静态代码块");
}
static {
System.out.println(name + "静态代码块");
}
public void method() {
System.out.println(name + "成员方法");
}
public static void main(String[] args) {
StaticTest s1;
StaticTest s2 = new StaticTest("s2");
StaticTest s3 = new StaticTest("s3");
s3.method();
}
}
上面代码运行结果为:
null静态代码块
null非静态代码块
s2构造方法
s2非静态代码块
s3构造方法
s3成员方法
执行步骤:name初始值为null
1.声明 StaticTest s1变量时并没有使用这个变量,所以不执行任何方法
2. new StaticTest("s2")时首先执行静态代码块,此时name值为null -> null静态代码块
3.然后执行非静态代码块,此时name值为null -> null非静态代码块
4.再执行构造方法,此时参数"s2"被传入,name值为"s2",没有调用成员方法所以不执行 method() -> s2构造方法
5. new StaticTest("s3")时由于静态代码块只被new一次,所以直接执行非静态方法,此时name值为"s2" ->s2非静态代码块
6.再执行构造方法,此时参数"s3"被传入,name值为"s3",调用成员方法执行 method() -> s3构造方法 s3成员方法