2020/5/29 牛客静态块

今天在做牛客的java练习题时候发现一个有意思的事记录一下。

/*以下代码的输出结果是?*/
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();
    }

}
/*A 静态块 构造块 构造块 构造块
* B 构造块 静态块 构造块 构造块
* C 构造块 构造块 静态块 构造块
* D 构造块 构造块 构造块 静态块
* */

答案选:C。
首先把大佬的解析发一下:
开始时JVM加载B.class,对所有的静态成员进行声明,t1 t2被初始化为默认值,为null,又因为t1 t2需要被显式初始化,所以对t1进行显式初始化,初始化代码块→构造函数(没有就是调用默认的构造函数),咦!静态代码块咋不初始化?因为在开始时已经对static部分进行了初始化,虽然只对static变量进行了初始化,但在初始化t1时也不会再执行static块了,因为JVM认为这是第二次加载类B了,所以static会在t1初始化时被忽略掉,所以直接初始化非static部分,也就是构造块部分(输出’‘构造块’’)接着构造函数(无输出)。接着对t2进行初始化过程同t1相同(输出’构造块’),此时就对所有的static变量都完成了初始化,接着就执行static块部分(输出’静态块’),接着执行,main方法,同样也,new了对象,调用构造函数输出(‘构造块’)开始时JVM加载B.class,对所有的静态成员进行声明,t1 t2被初始化为默认值,为null,又因为t1 t2需要被显式初始化,所以对t1进行显式初始化,初始化代码块→构造函数(没有就是调用默认的构造函数),咦!静态代码块咋不初始化?因为在开始时已经对static部分进行了初始化,虽然只对static变量进行了初始化,但在初始化t1时也不会再执行static块了,因为JVM认为这是第二次加载类B了,所以static会在t1初始化时被忽略掉,所以直接初始化非static部分,也就是构造块部分(输出’‘构造块’’)接着构造函数(无输出)。接着对t2进行初始化过程同t1相同(输出’构造块’),此时就对所有的static变量都完成了初始化,接着就执行static块部分(输出’静态块’),接着执行,main方法,同样也,new了对象,调用构造函数输出(‘构造块’)

其实大佬讲的很清楚了。但是我还是不太懂。因为我记得Java类中属性优先执行顺序是这样的。
1.父类静态代码块(java虚拟机加载类时,就会执行该块代码,故只能执行一次)
2.子类静态代码块(java虚拟机加载类时,就会执行该块代码,故只能执行一次)
3.父类属性对象初始化
4.父类普通代码块(每次new,每次执行)
5.父类构造函数(每次new,每次执行)
6.子类属性对象初始化
7.子类普通代码块(每次new,每次执行)
8.子类构造函数(每次new,每次执行)

故我认为首先肯定是静态块先执行。但是错的很彻底,这句话没错,但是对这几行代码理解的不是很充分。
在这里插入图片描述当我将两个静态成员打成注释的情况下,控制台输出的是按照java类中的顺序输出的,我放开一条的时候就多了一条输出语句。在这里插入图片描述
这时候再看大佬的解析就很清楚了,原因就是静态成员按照顺序执行,类被加载时候t1就被初始化了。所以构造块会在静态块之上。
当我们代码顺序调整为在这里插入图片描述
输出结果就是静态块在前面。所以Java类中属性优先执行顺序是正确的。
小小几行代码居然涉及到了这么多。借用我女朋友的话就是计算机不会骗你的,还得实际上手操作一下。获益匪浅。看来static理解的还是不够透彻。明天再整理记录一下。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值