回顧下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
變量或者方法的原因。