static块到底什么时候执行?

20 篇文章 0 订阅

 

转帖自 http://www.javaeye.com/topic/11003

 

 

  1. public interface Assembly{   
  2.     public void start(); 
  3. }   
  4.   
  5. public class Word implements Assembly{   
  6.     static{   
  7.         System.out.println("Word static initialization!");   
  8.     }       
  9.   
  10.     public  void start(){   
  11.         System.out.prinlnt("Word starts");   
  12.     }   
  13. }   
  14.   
  15. public class Office{   
  16.     public static void main(String args[]) throws Exception{   
  17.         Office off = new Office();   
  18.         System.out.println("类准备载入");   
  19.         Class c = Class.forName(args[0],true,off.getClass().getClassLoader());  
  20.         System.out.println("类准备实例化");   
  21.         Object o = c.newInstance(); 
  22.         Object o2= c.newInstance(); 
  23.    }   
  24. }

执行java Office Word,运行结果如下:

  1. “Loaded Office”
  2. “类准备载入”
  3. “Loaded Accembly”
  4. “Loaded Word””
  5. “Word static initialization”
  6. “类准备实体化”。


但是如果将Office.java中Class.forName(args[0],true,off.getClass().getClassLoader())中的true变为false,

 

即:  Class.forName(args[0],false,off.getClass().getClassLoader())

再执行java Office Word结果显示为:

 

  1. “Loaded Office”
  2. “类准备载入”
  3. “Loaded Accembly”
  4. “Loaded Word””
  5. “类准备实体化”
  6. “Word static initialization”。

 

一个类的运行,JVM做会以下几件事情

1、类装载

2、链接

3、初始化

4、实例化;

 

而初始化阶段做的事情是初始化静态变量和执行静态方法等的工作。

所以,当Class.forName(args[0],true,off.getClass().getClassLoader());中的true变为false的时候,就是告诉JVM不需再load class之后进行initial的工作。这样,将initial的工作推迟到了newInstance的时候进行。在类被初始化的时候,仅仅调用一次。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值