回顾下java基础、很多人可能不知道java中类加载的过程,记得很久以前面试被问过一道面试题如下:
Q:类的加载有几种方式?
new
Class.forName()
ClassLoader.loadClass()
Q:调用ClassLoader.loadClass()
的时候jvm做什么事情?
- 这个时候只是把该类加载到
jvm
中并对它进行了格式校验,并解析该文件,分配内存并赋值默认值,并且将符号引用替换成直接引用(内存地址)。
Q:这个时候再调用Class.forName()
做了什么事情?
- 这个时候由于类已经载入,所以不会再次进行加载,所以这个时候会检查类是否加载如果已加载则就初始化。初始就是执行静态代码块初始化。
Q:那么假如我定义了一个public int a=10
什么时候这个a=10
呢?
- 实例化的时候,用
newInstance()
的时候才开始赋值的,这也就是为什么static
中不能引用外部非staic
变量或者方法的原因。