装载和初始化

  1. Class c = Class.forName(args[0],true,off.getClass();.getClassLoader(););;     
Class c = Class.forName(args[0],true,off.getClass();.getClassLoader(););;   
可查看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. }    
public interface Assembly
{   
    public void start();;   
}   
  
public class Word implements Assembly
{   
    static
    {   
        System.out.println("Word static initialization!");;   
    }       
  
    public  void start();{   
        System.out.prinlnt("Word starts");;   
    }   
}   
  
public class Office{   
    public static void main(String args[]); throws Exception{   
        Office off = new Office();;   
        System.out.println("类别准备载入");;   
        Class c = Class.forName(args[0],true,off.getClass();.getClassLoader(););;   
        System.out.println("类别准备实例化");;   
        Object o = c.newInstance();;//这时已经初始化........   
        Object o2= c.newInstance();;   
   }   
}  


执行java Office Word,运行结果如下:
Java代码 复制代码
  1. “Loaded Office”    
  2. “类别准备载入”    
  3. “Loaded Accembly”    
  4. “Loaded Word””    
  5. “Word static initialization”    
  6. “类别准备实体化”。   
“Loaded Office” 
“类别准备载入” 
“Loaded Accembly” 
“Loaded Word”” 
“Word static initialization” 
“类别准备实体化”。 


但是如果将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”。  
“Loaded Office” 
“类别准备载入” 
“Loaded Accembly” 
“Loaded Word”” 
“类别准备实体化” 
“Word static initialization”。


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
一旦类初始化完成后就可以,那么就可以随时使用了!访问方法字段,创建实例!都可以!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值