毕业论文开发语言企业开发JAVA技术.NET技术WEB开发Linux/Unix数据库技术Windows平台移动平台嵌入式论文范文英语论文
您现在的位置: 毕业论文 >> java技术 >> 正文

关于JAVA的静态初始化时机

更新时间:2013-6-11:  来源:毕业论文

关于JAVA的静态初始化时机

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能否在编译期确定值??我认为能确定!

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或者说没进入main之前就已经执行了静态块了。

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

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

一个类在下列情形下才是主动使用,才会被初始化:
1、创建该类的实例
2、调用该类中声明的静态方法
3、操作该类或接口中声明的非编译期常量静态字段
4、调用特定的反射方法
5、初始化该类的子类
6、该类作为虚拟机启动时的初始类

不单单是null的问题,但null确实是问题之一

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

而A.a的类型是A

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

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

设为首页 | 联系站长 | 友情链接 | 网站地图 |

copyright©youerw.com 优尔论文网 严禁转载
如果本毕业论文网损害了您的利益或者侵犯了您的权利,请及时联系,我们一定会及时改正。