改了点网上的一个代码,java的加载 过程分为类的装载 -->连接 -->初始化 。
【装载】:载入编译后的.class文件,由classloader加载一般类型的类,数组类型的类,由jvm直接创建。
【连接】:对装在的二进制文件进行校验 ,类引用了别的类,会再加载引用的类,校验失败抛出ClassNotFoundException;校验完成后,初始化类的静态变量,执行静态块中的方法 。
【初始化】:new了一个类对象、反射调用了类的方法、子类调用了初始化或jvm指定初始化的类,会完成指定类的初始化工作。
加载的第三步的【初始化】与【链接】中的初始化不同,【链接】中的初始化在下面例子中的main方法运行时候,即时不执行new CslLoadTest();CslLoadTest类的num也被初始化,并且静态块被执行。而其他方法,则要调用了new CslLoadTest();才会执行。
package com.zyp.test.common;
public class CslLoadTest
{
public int k = 2;
public static int num =1;
{
num ++;
System.out.println("b num="+num+";k="+k);
}
static
{
num ++;
System.out.println("a num="+num);
}
{// 成员变量第三个
num ++;
System.out.println("c "+num+";k="+k);
}
CslLoadTest()
{
num ++;
System.out.println("d "+num+";k="+k);
}
static void run()
{
num ++;
System.out.println("e "+num);
}
public static void main(String[] args)
{
System.out.println("******begin*****");
// new CslLoadTest();
System.out.println("******end********");
}
}
该例子的最初是在这里看到的:http://www.cnblogs.com/andysd/archive/2012/05/17/2506500.html
但是我觉得写得有点不对,自己修改了点,请指正。