⑴ java靜態資源(靜態方法,靜態屬性)是程序一運行就載入到jvm中,還是當被調用的時候才進行載入呢
當類第一次被調用時載入(靜態方法,靜態屬性的載入就是類載入) 。
1、類中的靜態屬性會被加入到類對象(也可以叫做類的模板,是類的描述) 的構造器中,靜態方法也會被加入到類對象中。
2、當第一次使用類時,JVM會通過類載入器,載入類對象,從而初始化靜態屬性,並裝入類的方法,包括靜態方法和實例方法(方法不會被調用,只是載入,從這個意義上來說,靜態方法和實例方法是類似的)。
3、當創建類的實例對象時,JVM會調用類的構造器,從而初始化類的屬性。
(1)java類什麼時候載入擴展閱讀:
類(包括靜態方法、屬性)載入過程:
一、載入。
根據一個類的全限定名(如cn.e.h.test.HelloWorld.class)來讀取此類的二進制位元組流到JVM內部。
將位元組流所代表的靜態存儲結構轉換為方法區的運行時數據結構(hotspot選擇將Class對象存儲在方法區中,Java虛擬機規范並沒有明確要求一定要存儲在方法區或堆區中)轉換為一個與目標類型對應的java.lang.Class對象。
二、連接。
1、驗證。
驗證階段主要包括四個檢驗過程:文件格式驗證、元數據驗證、位元組碼驗證和符號引用驗證;
2、准備。
為類中的所有靜態變數分配內存空間,並為其設置一個初始值(由於還沒有產生對象,實例變數將不再此操作范圍內);
3、解析。
將常量池中所有的符號引用轉為直接引用(得到類或者欄位、方法在內存中的指針或者偏移量,以便直接調用該方法)。這個階段可以在初始化之後再執行。
⑵ java中類的載入是在什麼時候做的
樓上的負責一點好么,類載入是在編譯的時候?載入一個類需要用到載入器,
你程序都沒運行,jvm都沒啟動,哪來的載入器,你拿什麼去載入一個類?
類載入的時候是運行程序時 它就載入了,至於編譯,你用IDE,是你一保存,它就給編譯好了。
⑶ Java 類何時會被載入進JVM
生成該類對象的時候,會載入該類及該類的所有父類;
訪問該類的靜態成員(成員變數,成員方法)的時候;
使用class.forName("類名");
⑷ java中的類和對象分別是在什麼時候被載入和銷毀
類是當第一次運行的時候就會被載入,方法是當執行到的時候才會被載入,等全部執行完就會立即銷毀.如果想讓執行後的結果保存在物理介質中,需要定義輸出的位元組流等方法.
⑸ java中類裝載在什麼時候進行
java的類載入後且當使用階段完成之後,java類就進入了卸載階段,也就是所謂的釋放。
使用階段包括主動引用和被動引用,主動飲用會引起類的初始化,而被動引用不會引起類的初始化。
一個java類的完整的生命周期會經歷載入、連接、初始化、使用、和卸載五個階段,當然也有在載入或者連接之後沒有被初始化就直接被使用的情況,如圖所示:
PS:關於類的卸載,在類使用完之後,如果滿足下面的情況,類就會被卸載:
該類所有的實例都已經被回收,也就是java堆中不存在該類的任何實例。
載入該類的ClassLoader已經被回收。
該類對應的java.lang.Class對象沒有任何地方被引用,無法在任何地方通過反射訪問該類的方法。
如果以上三個條件全部滿足,jvm就會在方法區垃圾回收的時候對類進行卸載,類的卸載過程其實就是在方法區中清空類信息,java類的整個生命周期就結束了。
⑹ Java中類載入出現在哪個階段,編譯期和運行期 類載入和類裝載是一樣的嗎
使用的類,編譯/運行時都會被載入。
載入/裝載沒有區別,翻譯的詞彙選擇因人而異了
運行 javac /java 時 加上 -verbose 選項就可以看到了。
⑺ 什麼是類的載入何時載入
當程序主動使用某個類時,如果該類還未被載入到內存中,系統會通過載入,連接,初始化三個步驟來對該類進行初始化,JVM將會連續完成這三個步驟,也把這三個步驟統稱為類載入或類初始化。
類載入指的是將類Class文件讀入內存,並為之創建一個java.lang.Class對象,也就是說程序使用任何類時,系統都會為之建立一個java.lang.Class對象。
類是某一類對象的抽象,類是概念層次的東西,但類也是一種對象,每個類是一批具有相同特徵的對象的抽象,而系統中所有類,它們實際上也是對象,都是java.lang.Class的實例。
類的載入由類載入器完成,類載入器通常由JVM提供,這些類載入器也是所有程序運行的基礎,JVM提供的這些類載入器通常被稱為系統類載入器,開發者也可以通過繼承ClassLoader基類來創建自己的類載入器。
通過使用不同的類載入器,可以從不同來源載入類的二進制數據,通常有如下幾種來源:1.從本地文件系統來載入Class文件,這是大部分實常式序的類載入方式。
2從jar包中載入class文件,如JDBC編程時用到的資料庫驅動類就是放在jar文件中,JVM可以從jar文件中直接載入該Class文件。
3.通過網路載入class文件。
4.把一個java源文件動態編譯,並執行載入。
⑻ java 類載入先後順序
1.父類靜態代碼塊;
2.子類靜態代碼塊;
3.父類非靜態代碼塊;
4.父類構造函數;
5.子類非靜態代碼塊;
6.子類構造函數;
舉例:
public class ExA {
static {
System.out.println("父類靜態代碼塊。");
}
public ExA() {
System.out.println("父類構造函數。");
}
{
System.out.println("父類非靜態代碼塊。");
}
public static void main(String[] args) {
new ExB();
}
}
class ExB extends ExA {
static {
System.out.println("子類靜態代碼塊。");
}
{
System.out.println("子類非靜態代碼塊。");
}
public ExB() {
System.out.println("子類構造函數。");
}
}
執行結果:父類靜態代碼塊。子類靜態代碼塊。父類非靜態代碼塊。父類構造函數。子類非靜態代碼塊。子類構造函數。
⑼ java類載入順序
記住 3 條原則:
1、父類優先於子類
2、屬性優先於代碼塊優先於構造方法
3、靜態優先於非靜態
因此,類載入順序為:
父類靜態變數->父類靜態語句塊->子類靜態變數->子類靜態語句塊->父類普通成員變數->父類動態語句塊->父類構造器->子類普通成員變數->子類動態語句塊->子類構造器