1+1=2,很简单。大家都懂!但是你看看现在的幼儿园大班、小学生的作业题,有多少你会做出来,或者是一眼就看作出答案来?

不夸张的说,很多家长都被打败来。直到你认输,怀疑人生。

Java 小知识玩出大花样!_java

简单的知识,可以汇总出伟大的命题。今天我们就一起来看看打败了无数人的静态变量加载执行顺序面试题!

首先,说明一点。这篇文章是来自我的微信公众号里的一个群友的投稿。他看过我很多文章,加过我微信、微博、时刻关注着我的网站。他发给我的文档中有很多知识点,今天我先抽一个来分享给大家!

印象中,JVM 中静态变量的优先执行顺序可以归纳总结如下:

父类 static 块 -> 子类 static 块 -> 父类{}块 -> 父类构造函数 -> 子类{}块 -> 子类构造函数。

static 修饰的变量和 static 块具有一样的优先级,故两者具有前后顺序。

记住上面的执行顺序后,我们一起来看一个小测试:

Java 小知识玩出大花样!_java_02

其实我们公司在面试的时候,也有这套题,完全做对的不多。后来就降低了要求,只要能解释出大概的执行过程就算过!现在你自己计算一下输出结果,看看有多少人完全做对!

现在我公布答案,输出结果如下:

现在我们来复盘!

JAVA 类首次装入时,开始加载静态变量和静态块,也就是说会首先为静态区域分配内存空间,此时 tester、count1、count2 都已经分配空间,其中 tester 为一个引用空间,count1、count2 为默认值 0。

第二步开始执行 private static Test tester = new Test() 这段代码,调用构造器打印出 count1、count2 分别为 1 和 1 。

然后依次执行一下代码 private static int count1; private static int count2 = 2; 此时,count2 被重置为 2,因此如果此时再次打印的话 count1、count2 的值应该为 1 和 2。 

最后,感谢 薛明达 的投稿,他在群里也很活跃,感谢他!以后我们进行他的内容!

Java 小知识玩出大花样!_java_03