我理解的動態加載機制就是在須要的時候繼續加載,舉個簡單的例子:spa
public class test1 { public static void main(String[] args) { // TODO Auto-generated method stub System.out.println("--------"); People p = new People (); Pet pt = new Pet(); } }
用cmd命令Javac test1.Java先編譯生成.class文件code
再經過Java -version test1能夠看出全部被加載的類文件對象
標紅的部分是在代碼裏建立了People和Pet對象,因此被加載。blog
假設只聲明不實例化一個對象呢?圖片
public class test1 { public static void main(String[] args) { // TODO Auto-generated method stub System.out.println("--------"); People p = new People (); //Pet pt = new Pet(); Pet pt; } }
並無加載Pet類。cmd
說明只有類被實例化才華加載。io
另外在這個例子中看一下static語句塊與static方法在加載時的區別編譯
public class Pet { static { System.out.println("原來如此"); } public static void show(){ System.out.println("show"); } }
依然看第一張圖片,控制檯只輸出了「原來如此」,說明只執行了靜態塊語句。剛開始我誤覺得只要是靜態的就該被執行,class
如今看來二者是有區別的,靜態塊語句是類被加載時執行,是主動的;而靜態方法是調用時才執行,是被動的。test
那麼靜態方法(調用能夠不建立對象,直接經過類名.靜態方法名調用)和非靜態方法(必須建立對象再調用)都是調用時纔會執行,
那麼效率同樣嗎?爲何在我所接觸的項目中,大多數方法都是用非靜態方法呢?本身還要去研究下。