Java类加载的时机
来源:互联网 发布:合肥网络教育学校 编辑:程序博客网 时间:2024/05/22 00:46
类是什么时候初始化的?类初始化的时候会执行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类加载的时机
- Java 类的加载时机
- java类加载时机
- java中JVM加载类的时机
- JVM中java类的加载时机
- Java中类加载的时机
- JVM中java类的加载时机
- 类加载的时机
- 类加载的时机
- 类加载的时机
- java Class 的加载时机
- Java 程序加载加载--------类的初始化时机
- java中类的加载和加载时机
- java 类加载机制--类加载时机
- java类的加载 初始化时机,已经静态代码块的执行时机
- JVM_13_类加载的时机
- jvm4----类加载的时机
- Android初小试---一分钟傻瓜式打包
- udp_server_3333.c
- [SGU]108. Self-numbers II
- bsoj 1482 【NOI2004】郁闷的出纳员(splay入门)
- udp_client_3333bind8888.c
- Java类加载的时机
- FreeBSD 配置IP、修改SHEE提示符
- 分析怎样建设网站内部优化的几个要点
- C++,类的析构函数,语法练习
- 求抽取扑克牌顺子的概率
- 什么是预处理,何时需要预处理?
- 屏幕监控
- 韦的视频列表
- 用虚拟机(VMware Workstation 9.0)安装Fedora 8 镜像 (Linux系统)