今天想做spring的类加载的实验,所以恶补下java类加载的知识,看了深入理解java虚拟机211页的示例中的静态代码块,突然想到疯狂java里面总结非静态代码块总结得很好,当时自己看了之后感觉豁然开朗,但是现在只有一点印象,只记得是好像和构造方法有关,编译器处理的时候会优化。而这个非静态代码块的作用的印象,真是一点都没有啊。
学习就是这样,不总结,不温习,别说知新,永远是用的时候疲于学习,用完一无所有,所以我觉得每天总结下自己的学习,作为日志博客记载。不求人家共鸣,只求自己写的自己回头看的,能体会现在写博客的心境,并且愿意时常回头温习自己的日志。
非静态代码块的作用是作用是对象初始化的过程中,初始化数据域的一种机制(java核心技术1p130)。对象在初始化之前,成员域的定义在类方法区(方法区中的运行时常量池放的就是成员变量,接口,方法的描述应该是非静态方法;其他部分是类描述,常量,静态变量,静态方法等吧深入理解java虚拟机p41)中。基本类型有自己的默认值,引用类型为空,因为属于类,所以会在对象初始化前赋值。所以String类型默认是null,boolean默认是false。其次是定义变量的时候指定初始值和非静态代码块指定初始值(非静态代码块初始化非静态变量)。两者初始化的顺序与书写的顺序一致。其次是构造方法(疯狂的javap28)。疯狂的javap30中指出了编译器实际是讲赋值部分都提取到构造器中。
有非静态代码块。我觉得静态代码块是对类的初始化的时候,初始化静态数据域的一种机制。java核心技术1p131中就指出了可以使用静态的初始化块对静态域初始化。这里java核心技术将代码块称为初始化块可以看出,代码块的作用就是初始化域。类的初始化即是类加载的时候,java核心技术指出。类的第一次加载的时候,将会进行静态域的初始化。因此又回到类加载的问题上。
类什么时候加载呢?
深入理解java虚拟机p210指出了五种情况下类会被初始化,类初始化之前必须尽力加载、验证、准备阶段。
1.遇到new、getstatic、putstatic或invokestatic这4条字节码指令的时候,如果累没有进行初始化,则要对类进行初始化。要初始化就要加载。实例化对象,读取或设置类的静态字段,调用一个类的静态方法。
2.利用反射对类进行调用的时候。
3.初始化子类,必要先初始化父类。
4.虚拟机启动,用户指定的执行类(main方法类)。
5.看不懂。。。。
(本文为看书总结和自己猜想)
原文地址:https://www.cnblogs.com/startery/p/9893564.html