静态代码块、构造代码块和代码块

静态代码块

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值