装载和初始化

Class c = Class.forName(args[0],true,off.getClass();.getClassLoader(););;   
可查看API...............

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

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,运行结果如下:
“Loaded Office” 
“类别准备载入” 
“Loaded Accembly” 
“Loaded Word”” 
“Word static initialization” 
“类别准备实体化”。 


但是如果将Office.java中Class.forName(args[0],true,off.getClass().getClassLoader())中的true变为false,再执行java Office Word结果显示为:
“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
一旦类初始化完成后就可以,那么就可以随时使用了!访问方法字段,创建实例!都可以!

你可能感兴趣的:(java,C++,c,C#,Office)