| 网站首页 | 业界新闻 | 群组 | 人才 | 技术文章 | 下载频道 | 博客 | 代码贴 | 编程论坛
共有 234 人关注过本帖
标题:关于静态块,构造块,
只看楼主 收藏
白衣柳相
Rank: 2
等 级:论坛游民
威 望:1
帖 子:112
专家分:63
注 册:2016-12-23
结帖率:87.5%
  已结贴   问题点数:20  回复次数:5   
关于静态块,构造块,
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();
    }
}
这个输出结果为什么是   构造块 构造块 静态块 构造块
2017-08-08 10:28
calix
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:17
帖 子:220
专家分:1244
注 册:2015-5-4
  得分:10 
其实应该把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静态");
    }
}

2017-08-08 23:09
鸩羽丶千叶
Rank: 2
等 级:论坛游民
帖 子:1
专家分:10
注 册:2017-4-11
  得分:10 
构造块:直接在类中定义且没有加static关键字的代码块称为{}构造代码块。构造代码块在创建对象时被调用,每次创建对象都会被调用,并且构造代码块的执行次序优先于类构造函数。所以优先执行输出两次"构造块",然后执行静态块,最后执行main方法。所以输出的顺序就为"构造块 构造块 静态块 构造块"。
2017-08-09 11:45
白衣柳相
Rank: 2
等 级:论坛游民
威 望:1
帖 子:112
专家分:63
注 册:2016-12-23
  得分:0 
不管了,不想学java了,爬虫暂时也不研究了,兴致被打扰,偏偏我干什么都凭借兴致,玩android去。这个就随风飘荡了,可惜了。

我要好好学习了,准备考研ing
7 天前 07:43
白衣柳相
Rank: 2
等 级:论坛游民
威 望:1
帖 子:112
专家分:63
注 册:2016-12-23
  得分:0 
还是继续学习java,咳咳咳,因为感觉很强大,虽然最强大的应该 是c但是已经移情别恋了,

我要好好学习了,准备考研ing
7 天前 10:27
纵横阳仔
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:自学成才的火星人儿
等 级:版主
威 望:16
帖 子:126
专家分:549
注 册:2016-10-20
  得分:0 
相同等级为瀑布式加载
3 天前 10:11









关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.031259 second(s), 8 queries.
Copyright©2004-2017, BCCN.NET, All Rights Reserved