今天碰到一个题目,通过类名引用final静态字符串变量时,是否会触发类的初始化。
原来在书上看到类的初始化时机有这么一句话“读取或设置一个类的静态变量(被final修饰,已在编译期把结果放入常量池的静态字段除外)”
两部分都很重要!
今天发现给final变量赋值“sss”和new String(“sss”)是不同的效果。
图一
图二
仔细读那句话,图一在编译期就把“sss”放入了常量池(类加载的准备阶段完成赋值),而图二new String(“sss”)相当于一个对象,是在堆中的,所以是等到类初始化之后,才进行赋值。所以才产生了这样的差异。