JVM 中静态变量的优先执行顺序!

JAVA herman 425浏览
公告:“业余草”微信公众号提供免费CSDN下载服务(只下Java资源),关注业余草微信公众号,添加作者微信:xttblog,发送下载链接帮助你免费下载!
本博客日IP超过1800,PV 2600 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog,之前的微信号好友位已满,备注:返现
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
视频教程免费领

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

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

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

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

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

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

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

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

public class Test{
    private static Test tester = new Test(); 
    private static int count1;                 
    private static int count2 = 2;           
    public Test(){                          
        count1++;
        count2++;
        System.out.println("" + count1); 
 	System.out.println("" + count2);  
    }  
    public static Test getTester(){
        return tester;  
    }  
    // 业余草:www.xttblog.com
    public static void main(String[] args){  
        Test.getTester();
	System.out.println("" + count1); 
        System.out.println("" + count2); 
    }  
}

现在你自己计算一下输出结果,看看有多少人完全做对!

其实我们公司在面试的时候,也有这套题,完全做对的不多。后来就降低了要求,只要能解释出大概的执行过程就算过!

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

1
1
1
2

现在我们来复盘!

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。 

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

业余草公众号

最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加QQ1群:135430763(2000人群已满),QQ2群:454796847(已满),QQ3群:187424846(已满)。QQ群进群密码:xttblog,想加微信群的朋友,之前的微信号好友已满,请加博主新的微信号:xttblog,备注:“xttblog”,添加博主微信拉你进群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作可添加助理微信进行沟通!

本文原文出处:业余草: » JVM 中静态变量的优先执行顺序!