关于类的加载机制问题!! 求解惑??
最近一直在为这个类的加载机制问题头疼,晕晕乎乎的,总是把理不清思路,在google上也看了不少关于类加载机制的问题。
但是觉的自己还是理解的有问题....
class test{
public static void main(String args[]) {
new B();
}
}
class A {
}
class B extends A {
}
当我们执行一个test.class文件 时, Bootsartclassloader会将ExtClassLoader和AppClassLoader load到jvm中
然后AppClassLoader将改.class文件load到jvm中,
文件从main方法开始执行当执行到new B();时 因为类B继承自A
所以在构造导出类的时候先的构造出基类,因此基类也就是类A首先被AppClassLoader到jvm中
可是我就是不能理解,AppClassLoader怎么知道类B继承自A 它应该对类B.class文件进行分析,看它继承自哪个类,然后先把被继承的那个类load到JVM中
今天早上去了可同学探讨, 他告诉我 其实load类不是我上面所理解的
说程序运行试回根据import导入到jvm 的code区域,当我们执行程序的时候相应的就code区域相应的.clss文件然后分配到对应的栈 堆 方法块中
按我同学说的就可以理解为什么会先加载父类了
也就是在new b()的时候 jvm会对B.class进行分析 当它发现extends关键字的时候 就会把A.class进行内存分配, 然后再对b进行分配
这个加载倒底是把本地的.class文件加载到jvm中 还是把jvm中的.class文件加载到相应的内存分配区域中??
现在很糊涂,希望csdn的朋友帮我解决一下这个困惑!!!谢谢了!!