| 网站首页 | 业界新闻 | 群组 | 人才 | 技术文章 | 下载频道 | 博客 | 代码贴 | 编程论坛
绝地游戏外挂辅助教学千里之行 始于足下
共有 571 人关注过本帖
标题:关于静态块,构造块,
只看楼主 收藏
白衣柳相
Rank: 2
等 级:论坛游民
威 望:1
帖 子:124
专家分:63
注 册:2016-12-23
结帖率:85.71%
  已结贴   问题点数: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: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:27
帖 子:249
专家分:1442
注 册: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
帖 子:124
专家分:63
注 册:2016-12-23
  得分:0 
不管了,不想学java了,爬虫暂时也不研究了,兴致被打扰,偏偏我干什么都凭借兴致,玩android去。这个就随风飘荡了,可惜了。

自行打脸中,
2017-08-13 07:43
白衣柳相
Rank: 2
等 级:论坛游民
威 望:1
帖 子:124
专家分:63
注 册:2016-12-23
  得分:0 
还是继续学习java,咳咳咳,因为感觉很强大,虽然最强大的应该 是c但是已经移情别恋了,

自行打脸中,
2017-08-13 10:27
纵横阳仔
Rank: 7Rank: 7Rank: 7
来 自:自学成才的火星人儿
等 级:贵宾
威 望:22
帖 子:130
专家分:576
注 册:2016-10-20
  得分:0 
相同等级为瀑布式加载
2017-08-17 10:11







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

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