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();

就看到输出结果了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值