静态代码块
static{
//do something
}
静态代码块如上所示,和静态变量和静态方法一样,在类被类加载器首次加载时被执行,之后就不会被再次执行了(除非类加载器卸载该类后重新加载这个类)。
当有多个静态代码块时按顺序执行。
构造代码块
public class Test{
{
//do something
}
}
和静态代码块类似,但是没有static
,只能出现在类中,若出现在某个方法中则是普通代码块。
构造代码块会在new实例对象时,优先于构造方法调用,也就是说,先执行完构造代码块,才会接着执行构造方法。如果在一个构造方法里调用了另一个构造方法,此时构造代码块只会被执行一次,而不是执行两次。
当有多个构造代码块时按顺序执行。
代码块
public class Test{
public static void main(String[] args){
{
//do something
}
}
}
和构造代码块类似,但是只在方法或语句中出现,执行顺序和普通语句一样,先出现就先执行。
局部代码块是为了缩短变量的生命周期,定义在局部代码块中的变量在出了代码块之后就结束其生命周期,释放内存。
总结
执行顺序:(优先级从高到低)
静态代码块>main方法>构造代码块>构造方法
其中静态代码块只执行一次,构造代码块在每次创建对象是都会执行。
一道有意思的题目
对于下边这个类,其输出的结果是什么?
public class Test{
static Test test = new Test(1);
static{
System.out.println("static code block");
}
{
System.out.println("constructor code block");
}
Test(){
System.out.println("constrctor method");
System.out.println("a=" + a + ",b=" + b);
a++;
b++;
}
Test(int a){
this();
this.a = a;
System.out.println("constrctor method2");
System.out.println("a=" + a + ",b=" + b);
}
public static void main(String[] args){
{
System.out.println("code block");
}
method();
Test test2 = new Test();
method();
}
public static void method(){
System.out.println("static method");
}
int a = 10;
static int b = 100;
}
答案
constructor code block
constrctor method
a=10,b=0
constrctor method2
a=1,b=1
static code block
code block
static method
constructor code block
constrctor method
a=10,b=100
static method