前段时间看了一下关于java ClassLoader的问题,突然想问一下类的载入顺序问题,import java.test.A;
import java.test.B;
import java.test.C;
import java.test.D;Class Son extends Father
{
A a;
static B b;
static C c = new C();
D d = new D();
}在这里想问一下,
1.在Son类载入时,Father类会先载入吗?
2.所谓的载入类,到底是载入什么内容呢,仅仅是将.class的文件通过JVM读取到ClassLoader中吗?
3.这里Son类中的成员a、b、c、d在载入时,相关联的A、B、C、D类定义会载入ClassLoader吗?还是仅仅有static定义的静态成员才会被载入,或者说只有new操作的才能载入?
这种情况好像很难测试出来,因为类的载入和成员初始化是两个步骤,无法确认载入时做了哪些动作。还请各位大虾指教。
import java.test.B;
import java.test.C;
import java.test.D;Class Son extends Father
{
A a;
static B b;
static C c = new C();
D d = new D();
}在这里想问一下,
1.在Son类载入时,Father类会先载入吗?
2.所谓的载入类,到底是载入什么内容呢,仅仅是将.class的文件通过JVM读取到ClassLoader中吗?
3.这里Son类中的成员a、b、c、d在载入时,相关联的A、B、C、D类定义会载入ClassLoader吗?还是仅仅有static定义的静态成员才会被载入,或者说只有new操作的才能载入?
这种情况好像很难测试出来,因为类的载入和成员初始化是两个步骤,无法确认载入时做了哪些动作。还请各位大虾指教。
//类初始化
}回答
1. 当然会
2. 就是把类的结构读入内存吧
3. 用到的都会加载,和static无关
2、读取.class文件到方法区,并在堆上创建该类的Class对象。
3、类A、B不会载入,类C、D会载入
在下面情况下会载入:创建类的对象、调用类的静态方法,访问类的静态成员、调用Class.forName()静态方法,构造该类的子类对象、启动虚拟机的标志类。详情请参阅java相关文档:类的初始化、对象的初始化。 谢谢!
即ClassLoader在加载一个Class的时候会将改Class所依赖和所引用的所有类也由这个ClassLoader负责载入,除非显式指定其它。