static 标识的字段或者是代码块,真的是在类加载的时候初始化的吗?

lihuayang 发布于 2017/03/09 15:54
阅读 220
收藏 0
class AAA {
	static {
		System.out.println("class AAA static block println"); // 并没有打印此句
	}
}

public class Main {
	public static void main(String[] args) {
		System.out.println("hello world!");
	}
}

一直以来都以为 static 标识的代码块或者是字段,都是在类加载的时候就被执行或者赋值了,但是这么一看....感觉自己的世界观都要被刷新了。

所以此处是类没有被加载吗?还是说我们一直以来认为的,静态代码块、字段都在类加载的时候被初始化的,这个观点是错误的?

在《深入理解Java虚拟机:JVM高级特性与最佳实践 第2版》中找到一些线索,如下图:

所以照这么说,是在第一次主动访问该类的时候执行

小弟好生迷惑啊....大家快说说你们的观点

 

加载中
1
Nehway
Nehway

你可以这样理解,static静态部分是属于类本身的。初始化类,其类变量和静态块就会加载。

首先java虚拟机允许预加载某个类,一般时候是使用某个类的时候才会初始化这个类(您的代码并没有触发初始化这个类的条件),毕竟没有必要初始化不实用的类或者接口占用内存。

这和您的理解矛盾吗?

Nehway
Nehway
回复 @lihuayang : 好的,你理解了就好
lihuayang
lihuayang
不矛盾,所以说,静态代码块,是在类第一次被访问的时候被执行的是吧?我就是不明白,静态代码块,被执行的时机,以前一直以为是在,类加载进 jvm 的时候就执行,但是这个么一试验的话,就证明并不是这么回事。
0
焙焙龙
焙焙龙

JAVA用的按需加载的策略,你代码里面完全没有用到AAA这个类,自然不会去执行

返回顶部
顶部