注册 登录
编程论坛 JAVA论坛

关于静态块,构造块,

白衣柳相 发布于 2017-08-08 10:28, 2422 次点击
public class B
{
    public static B t1 = new B();
    public static B t2 = new B();
    {
        System.out.println("构造块");
    }
    static
    {
        System.out.println("静态块");
    }
    public static void main(String[] args)
    {
        B t = new B();
    }
}
这个输出结果为什么是   构造块 构造块 静态块 构造块
5 回复
#2
calix2017-08-08 23:09
其实应该把main方法中的代码删掉,就更清晰了
JVM先加载class B,加载完成后开始执行静态的main方法
public static B t1 = new B();
执行到第一行时,JVM发现class B已经加载了(现在还没加载完成),开始调用构造方法,此时不会再执行静态方法(静态代码块只会在类加载的时候执行一次)
所以执行了System.out.println("构造块");
第二行同理
再到后面的static{System.out.println("静态块");}
执行main方法时,class B已经加载完成了

这个代码由于类加载过程中调用了构造方法,被暂时打断了,所以显得比较特殊,如果调用的是个外部的类就不会了
把第一行代码改成调用其他类,就会发现静态块是先于实例块执行的
public static Sub t1 = new Sub();
public class Sub {
    {
        System.out.println("sub构造");
    }

    static {
        System.out.println("sub静态");
    }
}

#3
鸩羽丶千叶2017-08-09 11:45
构造块:直接在类中定义且没有加static关键字的代码块称为{}构造代码块。构造代码块在创建对象时被调用,每次创建对象都会被调用,并且构造代码块的执行次序优先于类构造函数。所以优先执行输出两次"构造块",然后执行静态块,最后执行main方法。所以输出的顺序就为"构造块 构造块 静态块 构造块"。
#4
白衣柳相2017-08-13 07:43
不管了,不想学java了,爬虫暂时也不研究了,兴致被打扰,偏偏我干什么都凭借兴致,玩android去。这个就随风飘荡了,可惜了。
#5
白衣柳相2017-08-13 10:27
还是继续学习java,咳咳咳,因为感觉很强大,虽然最强大的应该 是c但是已经移情别恋了,
#6
纵横阳仔2017-08-17 10:11
相同等级为瀑布式加载
1