圣思園找的文檔和視頻,這里記錄筆記
變量和方法在棧里,對象在堆里,字節碼在方法區
當加載、連接完成后,虛擬機在類被“首次主動使用”時初始化它們
new instance訪問 static 變量或賦值調用 static 方法反射 Class.forName初始化一個類的子類啟動類初始化子類時必須先初始化父類,但不會先初始化實現的接口,初始化接口時也不會先初始化其父接口。只有首次使用接口的靜態變量時,才會導致接口的初始化。
類加載器把類加載到JVM中。 類的加載采用父委托機制,這種機制能更好保證java平臺的安全。在此委托機制中,除了Bootstrap之外,其余的ClassLoaer有且只有一個ClassLoader。 這種父子關系并不是繼承關系,Bootstrap根本不是java對象,怎么繼承?它們實際上是包裝關系。 JVM自帶
根類加載器 Bootsrap擴展類加載器 Extension系統類加載器 System用戶自定義
java.lang.ClassLoader的子類Bootstrap
頂層加載器,C++實現,負責加載JVM的核心類庫,如加載java.lang.Object。從系統屬性sun.boot.class.path指定目錄加載類庫。
Extension
它的父加載器為根加載器,java實現,繼承java.lang.ClassLoader。從系統屬性java.ext.dirs指定目錄或jre/lib/ext安裝目錄加載類庫。
System
也稱應用類加載器,父加載器為擴展類加載器,繼承java.lang.ClassLoader。從環境變量classpath或者系統屬性java.class.path指定目錄加載類。 System是用戶自定義的類加載器的默認父加載器。
ClassLoader
所有用戶自定義的類加載器應該繼承ClassLoader類。
如果一個類加載器能成功加載指定類,那它就被稱為定義類加載器,所有能成功返回Class對象的引用的類加載器(包括定義類加載器)都被稱為初始類加載器。
每個類加載器都有自己的命名空間,命名空間由自己和所有父加載器所加載的類組成。 由同一類加載器加載的屬于相同包的類組成運行時包。同一類、同一包才能互相訪問包可見。這樣限制可以避免用戶冒充核心類庫中的類,去訪問核心類庫的包可見成員。
新聞熱點
疑難解答