装载和初始化

  1. Class c = Class.forName(args[0],true,off.getClass();.getClassLoader(););;     
[java]  view plain  copy
  1. <span style="font-size: medium;">Class c = Class.forName(args[0],true,off.getClass();.getClassLoader(););;     
  2. </span>  
可查看API............... 

Class.for(str,true...) 
是在装载的时候也进行连接和初始化!! 
这时装载的类,其实也进行了初始化! 
而Static静态初始化语句是在初始化的时候执行一次!!在接下来的如果还要创建这个类的实例!则不会初始化!! 

Java代码  复制代码
  1. public interface Assembly   
  2. {      
  3.     public void start();;      
  4. }      
  5.      
  6. public class Word implements Assembly   
  7. {      
  8.     static  
  9.     {      
  10.         System.out.println("Word static initialization!");;      
  11.     }          
  12.      
  13.     public  void start();{      
  14.         System.out.prinlnt("Word starts");;      
  15.     }      
  16. }      
  17.      
  18. public class Office{      
  19.     public static void main(String args[]); throws Exception{      
  20.         Office off = new Office();;      
  21.         System.out.println("类别准备载入");;      
  22.         Class c = Class.forName(args[0],true,off.getClass();.getClassLoader(););;      
  23.         System.out.println("类别准备实例化");;      
  24.         Object o = c.newInstance();;//这时已经初始化........      
  25.         Object o2= c.newInstance();;      
  26.    }      
  27. }    
[java]  view plain  copy
  1. <span style="font-size: medium;">public interface Assembly  
  2. {     
  3.     public void start();;     
  4. }     
  5.     
  6. public class Word implements Assembly  
  7. {     
  8.     static  
  9.     {     
  10.         System.out.println("Word static initialization!");;     
  11.     }         
  12.     
  13.     public  void start();{     
  14.         System.out.prinlnt("Word starts");;     
  15.     }     
  16. }     
  17.     
  18. public class Office{     
  19.     public static void main(String args[]); throws Exception{     
  20.         Office off = new Office();;     
  21.         System.out.println("类别准备载入");;     
  22.         Class c = Class.forName(args[0],true,off.getClass();.getClassLoader(););;     
  23.         System.out.println("类别准备实例化");;     
  24.         Object o = c.newInstance();;//这时已经初始化........     
  25.         Object o2= c.newInstance();;     
  26.    }     
  27. }    
  28.   
  29. </span>  

执行java Office Word,运行结果如下: 
Java代码  复制代码
  1. “Loaded Office”    
  2. “类别准备载入”    
  3. “Loaded Accembly”    
  4. “Loaded Word””    
  5. “Word static initialization”    
  6. “类别准备实体化”。   
[java]  view plain  copy
  1. <span style="font-size: medium;">“Loaded Office”   
  2. “类别准备载入”   
  3. “Loaded Accembly”   
  4. “Loaded Word””   
  5. “Word static initialization”   
  6. “类别准备实体化”。 </span>  


但是如果将Office.java中Class.forName(args[0],true,off.getClass().getClassLoader())中的true变为false,再执行java Office Word结果显示为: 
Java代码  复制代码
  1. “Loaded Office”    
  2. “类别准备载入”    
  3. “Loaded Accembly”    
  4. “Loaded Word””    
  5. “类别准备实体化”    
  6. “Word static initialization”。  
[java]  view plain  copy
  1. <span style="font-size: medium;">“Loaded Office”   
  2. “类别准备载入”   
  3. “Loaded Accembly”   
  4. “Loaded Word””   
  5. “类别准备实体化”   
  6. “Word static initialization”。</span>  


Class.forName(false)会装载类!但不会初始化!!这时不会执行程序!!看上面的例子!经过试验 Class.forName默认为是true! 
例如DriverManager.forName()如果只是重载,而不初始化的话 那么驱动程序就会不会注册!则也就不能正常使用! 
在网上看见这个(感觉大错) 
Java初始化顺序 
1在new B一个实例时首先要进行类的装载。(类只有在使用New调用创建的时候才会被java类装载器装入) 
2,在装载类时,先装载父类A,再装载子类B 
3,装载父类A后,完成静态动作(包括静态代码和变量,它们的级别是相同的,安装代码中出现的顺序初始化) 
4,装载子类B后,完成静态动作 
类装载完成,开始进行实例化 
1,在实例化子类B时,先要实例化父类A 
2,实例化父类A时,先成员实例化(非静态代码) 
3,父类A的构造方法 
4,子类B的成员实例化(非静态代码) 
5,子类B的构造方法 
我感觉有几个 地方不妥! 
装载只是接受class文件的字节流,进行解析成为方法区内部的数据结构!装载不一定到使用的时候才开始装载! 
在经过验证、准备(类变量的初始化--不是真正的初始化)这时还没有运行程序! 
再进行解析,--在常量池里寻找类、字段、引用、接口,把符号引用转换成直接引用 
然后进行初始化。如果一个类存在超类的话先初始化超类!如果存在类初始化方法,就运行次方法(static块方法)!--初始化过程 
上面还说道类只有在new调用时才会被java磊装载器装入! 
如果把上面的理解为初始化的话也不对! 
初始化有严格的发生时机! 
也就是主动使用!1类实例化2使用类的静态方法3调用某个类的或接口的静态字段或者给该字段赋值时!4初始化子类的时候!(这个时候子类初始化所以他本身被要求初始化) 
。。。 
类实例化--clone newInstance 
据自己测试,newInstance是根据构造函数创建实例的!也就是说相当于new 
clone 只是初始化 而不调用new  
实例化不等于new 
一旦类初始化完成后就可以,那么就可以随时使用了!访问方法字段,创建实例!都可以!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值