你不太可能完全用代码证明类加载的动作,因为在你用这个类之前(也就是你想要开始证明一个类加载的过程时)她已经加载了。
现在来说,静态成员会和类加载的时候一起初始化,所以最多最多也只能通过静态成员来证明类的加载。
那么问题就是如何在静态成员被初始化的时候提示消息,两种方法:
第一种是使用静态的字段成员,此成员指定为一个对象初始化,在这个初始化对象的构造函数做通知。代码:
public class StaticLoad{
public static LoadNotify = new LoadNotify();
}
public class LoadNotify{
public LoadNotify(){
System.out.println("Class is Loaded");
}
}
那么使用StaticLoad类的时候,会打出Class is Loaded证明类加载的时候初始化了static成员,调用多次也仅会打出一次。
第二种是使用静态块,代码:
public class StaticLoad{
public static LoadNotify = new LoadNotify();
static {
System.out.println("Class is Loaded");
}
}
此时类加载时也会执行静态块中的代码。
这是进行当类加载的时候进行通知的方法,你可以自己写一写代码,他们仅会打出一次。
对于类的加载顺序,网上有详细的,我这里只说一些简单的:
首先需要用到一个类的时候,虚拟机会从classpath读取此类的代码,到内存的类的代码存储区,然后对于每一个静态字段开辟一个存储区,再存储方法的代码。接着初始化类,所有的静态成员按照顺序初始化(按代码声明顺序从上到下开始),当需要加载其他类的时候加载其他的类。然后完成初始化供虚拟机使用。
当实例化一个类的时候,如果需要加载的话,会按照上面的顺序加载,然后在内存中分配所有实例字段的空间,接着调用构造函数,其中构造函数会(显示或隐式的)调用父类构造函数(此过程向上递归),然后执行剩下的构造代码。最后返回实例化的对象的引用返回构造函数。