最后给大家一道面试题练练手,要求写出其结果(笔试)

  1. public class StaticTest {
  2. public static int k = 0;
  3. public static StaticTest t1 = new StaticTest("t1");    
  4. 代码执行完这一行发生了什么?之所以会执行这行代码,是main方法里面第一次 new的缘故,第一次new,会加载这个类的static变量,static方法(不执行)和static块,因为 t1 是static,所以会执行这一行代码  但 t1 这里又new了一个StaticTest对象,由于在main方法里面已经new了一个,所以这里new的不再加载static变量和块,只初始化变量j,加载构造快和构造函数,在加载 j 时,又需要用到static变量 i 和 n ,但此时并未给 i 和 n 初始化(因为还没有执行到给 i 和 n 初始化的代码),所以此时的 i 和 n 用默认值 0 !  我去。。。。
  5. 当代吗执行到这时,jvm如何知道这已经是第二次new了?因为类加载过程中存在一个准备阶段,这个阶段是在方法区中为所有类变量赋初值(除了static final是直接赋了指定值);然后才到了类初始化阶段,这里执行到new实际上是到了类初始化阶段,这时方法区已经有了这个类的信息了,所以jvm才知道这不是第一次new;

注:main方法所在类,是被隐式初始化了,但没有被实例化

  1. public static StaticTest t2 = new StaticTest("t2");
  2. public static int i = print("i");
  3. public static int n = 99;
  4. public int j = print("j");
  5. {
  6. print("构造块");
  7. }
  8. static{
  9. print("静态块");
  10. }
  11. public StaticTest(String str) {
  12. System.out.println((++k) + ":" + str + " i=" + i + " n=" + n);
  13. ++n;
  14. ++i;
  15. }
  16. public static int print(String str) {
  17. System.out.println((++k) + ":" + str + " i=" + i + " n=" + n);
  18. ++i;
  19. return ++n;
  20. }
  21. public static void main(String[] args) {
  22. StaticTest t = new StaticTest("init");
  23. }
  24. }

结果:

  1. 1:j i=0 n=0
  2. 2:构造块 i=1 n=1
  3. 3:t1 i=2 n=2
  4. 4:j i=3 n=3
  5. 5:构造块 i=4 n=4
  6. 6:t2 i=5 n=5
  7. 7:i i=6 n=6
  8. 8:静态块 i=7 n=99
  9. 9:j i=8 n=100
  10. 10:构造块 i=9 n=101
  11. 11:init i=10 n=102

这个留给大家去思考,如果一眼便能便知道为什么是这样的输出结果,那么静态方面知识应该比较扎实了

感悟:

提示一下 :

1.加载的顺序:先父类的static成员变量 -> 子类的static成员变量 -> 父类的成员变量 -> 父类构造 -> 子类成员变量 -> 子类构造

2.static只会加载一次,所以通俗点讲第一次new的时候,所有的static都先会被全部载入(以后再有new都会忽略),进行默认初始化。在从上往下进行显示初始化。这里静态代码块和静态成员变量没有先后之分,谁在上,谁就先初始化

3.构造代码块是什么?把所有构造方法中相同的内容抽取出来,定义到构造代码块中,将来在调用构造方法的时候,会去自动调用构造代码块。构造代码快优先于构造方法。

面试题--JAVA中静态块、静态变量加载顺序的更多相关文章

  1. (转)面试题--JAVA中静态块、静态变量加载顺序详解

    public class Test { //1.第一步,准备加载类 public static void main(String[] args) { new Test(); //4.第四步,new一个 ...

  2. JAVA中静态块、静态变量加载顺序详解

    http://blog.csdn.net/mrzhoug/article/details/51581994 一般顺序:静态块(静态变量)——>成员变量——>构造方法——>静态方法

  3. Java---类加载机制,构造方法,静态变量,(静态)代码块,父类,变量加载顺序

    直接上代码: 代码1: public class ConstroctTest { private static ConstroctTest test = new ConstroctTest(); // ...

  4. IDEA中Springboot静态文件加载(热部署)

    Springboot项目静态文件加载 昨天写项目的时候碰到一个问题,就是静态文件css无法读取到项目中,我仔细思考了下,总结了下,可能有两个问题 1.页面未加载更新 这个可能性非常大,Chrome就是 ...

  5. 【java虚拟机系列】java中类与对象的加载顺序

    首先了解一下Java虚拟机初始化的原理. JVM通过加装.连接和初始化一个Java类型,使该类型可以被正在运行的Java程序所使用.类型的生命周期如下图所示: 装载和连接必须在初始化之前就要完成. 类 ...

  6. jsp页面中的代码执行加载顺序介绍

    1. java是在服务器端运行的代码,jsp在服务器的servlet里运行,而javascript和html都是在浏览器端运行的代码.所以加载执行顺序是是java>jsp>js. 2. j ...

  7. web工程中web.xml元素加载顺序以及配置实例

    简介 web.xml是web工程的配置文件,容器加载web工程时,会首先从WEB-INF中查询web.xml,并加载其中的配置信息,可以将web.xml认为是web工程的入口. web.xml中包含有 ...

  8. java中的静态变量、静态方法与静态代码块详解与初始化顺序

      我们知道类的生命周期分为装载.连接.初始化.使用和卸载的五个过程.其中静态代码在类的初始化阶段被初始化. 而非静态代码则在类的使用阶段(也就是实例化一个类的时候)才会被初始化. 静态变量 可以将静 ...

  9. java中的静态变量,静态方法与静态代码块详解

    java中的类的生命周期分为装载,连接,初始化,使用,和卸载五个过程. 而静态代码在类的初始化阶段被初始化. 而非静态代码则在类的使用阶段(也就是实例化一个类的时候)才会被初始化. 静态变量 可以将静 ...

随机推荐

  1. PB调用C# Windows窗体

    以下是PB中的代码:String ls_filenameLong ll_wstyle=1long ll_hwnd,ll_nShowCmdstring ls_lpOperation,ls_lpFile, ...

  2. python 中 模块,包, 与常用模块

    一 模块 模块:就是一组功能的集合体, 我们的程序可以直接导入模块来复用模块里的功能 导入方式 一般为 : import 模块名 在python中, 模块一般分为四个通用类别 1使用python编写. ...

  3. UVa 1658 Admiral (最小费用流)

    题意:给定一个图,求1-n的两条不相交的路线,并且权值和最小. 析:最小费用流,把每个结点都拆成两个点,中间连一条容量为1的边,然后一个作为入点,另一个是出点.最后跑两次最小费用流就行了. 代码如下: ...

  4. CodeForces - 566D Restructuring Company 并查集的区间合并

    Restructuring Company Even the most successful company can go through a crisis period when you have ...

  5. jQuery获取table当前所在行

    $("div tbody tr").click(function() {         var rows = $(this).prevAll().length + 1;//行号  ...

  6. 怎么解决UIScrollView把uitableviewcell的点击事件屏蔽了

    [self.contentView addSubview:self.scrollView]; self.scrollView.userInteractionEnabled = NO; [self.co ...

  7. 常用SQL语句写法(一)

    <resultMap id="userResult" type="com.cloudwalk.shark.model.User"> <id p ...

  8. go系列(4)- go环境和docker容器的使用

    这篇文章讲述把go环境及beego框架装进容器.docker的安装该篇不讲述,请自行查阅.本篇是基于docker已经安装的前提. 跟据前三篇系列,然后写Dockerfile,一般是到项目的根目录下 1 ...

  9. java简单操作redis数据库

    package RedisTest; import redis.clients.jedis.Jedis; public class RedisTest { private static String ...

  10. python之yagmail发送邮件

    yagmail发送邮件 import yagmail yag = yagmail.SMTP(user="xxxxxxxxxx@163.com",password="xxx ...