首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

:关于JAVA的静态初始化时机!

2012-10-05 
高手请进:关于JAVA的静态初始化时机!!Java codeclass A {public static final A anullstatic{System.out

高手请进:关于JAVA的静态初始化时机!!

Java code
class A {        public static final A a=null;        static{System.out.println("A");}} public class Test{         public static void main(String[] args)          {                Object o=A.a;        }  }  

我觉得应该什么都不输出,但运行结果输出A。
我想知道,A.a能否在编译期确定值??我认为能确定!
高手说说自己的意见。。。

[解决办法]
不单单是null的问题,但null确实是问题之一

更重要的一个问题是会写到B.class常量池中的类型是有限的:String和几个基本类型

而A.a的类型是A

如果将a的类型改为String,为null仍然会去getstatic

如果a的类型为String,且有一个字符串值,那么B就使用ldc指令直接从B的常量池中取值,这表示a的值在编译的时候已经放到B.class中了



探讨

引用:

这很好办,javap -c Test一下看看取A.a用的什么指令

引用:

引用:

那叫编译期常量,就是编译的时候就能确定值的常量。

假如A.a的值是编译期常量,如果B类中使用了A.a,编译的是时候在B.class存的就不是A.a的符号引用,而直接是A.a的值,这就不是主动使用了

引用 9 楼 ……

热点排行