我是靠谱客的博主 雪白奇异果,最近开发中收集的这篇文章主要介绍Java类加载的时机,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

类是什么时候初始化的?类初始化的时候会执行static块,这个是我们知道的。那么我们可以用static块来做个实验。

上面代码输出是:

hello world
init
this is a test
这说明了什么?在调用TR.hello_world的时候,类并没有初始化!而是在调用其方法test的时候才初始化的。

这是因为在编译的时候,常量(static final 修饰的)会存入调用类的常量池【这里说的是main函数所在的类的常量池】,调用的时候本质上没有引用到定义常量的类,而是直接访问了自己的常量池。所以,这里调用TR.hello_world的时候,TR并没有初始化。

-----------------------------------------------混混哥----------------------------------------------------

类初始化的时机,有且仅有四个:

1、遇到new、getstatic、putstatic、invokestatic这四条字节码指令的时候。

2、使用java.lang.reflect进行反射调用的时候

3、当初始化一个类的时候,发现其父类还没有初始化,那么先去初始化它的父类

4、当虚拟机启动的时候,需要初始化main函数所在的类

----------------------------------------------友谊哥-----------------------------------------------

说到这里,还要说下,静态变量和静态初始化块,普通变量、普通初始化块之间的初始化顺序。看这里

链接中说明了,静态变量和静态初始化块的声明顺序决定了初始化的顺序。

静态变量和静态初始化块的初始化时间::早于::普通变量和普通初始化块::早于::构造方法。

并不是完全父类初始化完毕之后,子类才开始初始化。实际上子类的静态变量和静态初始化块的初始化是在父类的变量、初始化块和构造器初始化之前就完成了。

----------------------------------------------友谊哥格格个个-----------------------------------------------

看下面的代码:

上面报错的地方,有点奇怪。

明明在上面都赋值b=2了的。怎么打印语句就不行呢。

这是因为在类初始化的时候,就规定了,静态语句块中只能访问到定义在静态语句块之前的变量,定义在它之后的,只能赋值,不能访问。

最后

以上就是雪白奇异果为你收集整理的Java类加载的时机的全部内容,希望文章能够帮你解决Java类加载的时机所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(45)

评论列表共有 0 条评论

立即
投稿
返回
顶部