參考資料:
先說一下class文件裏面import和package的做用。package用於對一個class進行命名。包名加上類名就是構成了類的完整限定名稱。import主要是一個java語法糖,能夠避免在引用每一個類的時候都須要寫完整限定名,在import了相應的類以後就不用再寫類的完整限定名稱了。在編譯完成後的class文件裏面都是採用的完整限定名稱。
1. java程序包是由多個class文件構成的,在java程序啓動的時候,jvm會使用classloader去從指定的位置中尋找class文件,而且將class文件的內容讀入內存中建立class對象。classloader就是用來加載class對象的。
2. java默認提供了三個classloader,第一個是bootstrapclassloader,這是native(c++)實現的,屬於jvm的一部分,沒有繼承classloader這個抽象類,bootstrapclassloader主要負責加載jdk中的核心類庫,能夠經過System.out.println(System.getProperty("sun.boot.class.path"))打印出來看看。第二個是extension classloader,擴展類加載器,負責加載java的擴展類庫,默認加載JAVA_HOME/jre/lib/ext/目錄下的jar。第三個appclassloader,稱之爲系統類加載器,負責加載classpath所指定的目錄下的全部jar。
3. 在java中,多個classloader採用必定的層次組織在一塊兒,在加載的時候使用的是委託機制,每個classloader都有一個父classloader,若是不顯示指定一個父親的話,那麼將父親設置爲系統類加載器。當須要加載一個class的時候,若是一個class已經被加載了那麼直接返回,不然委託給父classloader去加載,若是父classloader沒有load的話那麼就依據指定路徑去findclass。圖和相應代碼以下:
代碼應該更直觀一點
4. 使用3這種加載的好處是能夠避免重複加載,從安全方面講這樣能夠避免咱們用自定義的類型去覆蓋了java核心api中的類。