您好,欢迎来到纷纭教育。
搜索
您的当前位置:首页java 初始化参数_JAVA类的初始化顺序与initialize参数

java 初始化参数_JAVA类的初始化顺序与initialize参数

来源:纷纭教育

JAVA类的初始化顺序依次是:(静态变量、静态初始化块)->(变量、初始化块)->构造函数,

相同级别的以定义顺序为准,  且静态变量和静态初始化块只初始化一次。通过下面的代码来验证。

publicclassClassA {

{

System.out.println("Init Block!!");

}

static{

System.out.println("Static Init Block!!");

}

privatestaticClassB sMemVariable =newClassB(

"Static Member Variable Inited!!");

publicClassA() {

System.out.println("Constructer execute!!");

}

publicClassB memVariable =newClassB("Member Variable Inited!!");

publicstaticvoidmain(String[] args) {

ClassA o =newClassA();

ClassA o2 =newClassA();

}

}

publicclassClassB {

publicClassB(String mes) {

System.out.println(mes);

}

publicstaticvoidmain(String[] args)throwsClassNotFoundException {

try{

Class.forName("test.ClassA");//(1)

}catch(Exception e) {

}

}

}

运行ClassA输出结果为:

Static Init Block!!

Static Member Variable Inited!!

Init Block!!

Member Variable Inited!!

Constructer execute!!

Init Block!!

Member Variable Inited!!

Constructer execute!!

静态变量和静态初始化块的初始化发生在类加载完成之后。验证如下:

运行ClassB输出结果为:

Static Init Block!!

Static Member Variable Inited!!

的确如此,但这个说法并不正确,如果ClassB代码(1)处改成:

Class.forName("test.ClassA", false,ClassB.class.getClassLoader());

再次运行,就看不到输出结果了。问题再于Class.forName的第二个参数(initialize)为false,

类加载之后不执行静态变量与静态块的初始化,而把这一工作放到第一次创建对像时完成。

Class.forName("test.ClassA")方法设为initialize为true(参考JDK源码);

修改(1)处代码为Class.forName("test.ClassA", false,ClassB.class.getClassLoader()).newInstance();

就看到输出结果了。

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- fenyunshixun.cn 版权所有 湘ICP备2023022495号-9

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务