導航:首頁 > 編程語言 > java類載入與初始化

java類載入與初始化

發布時間:2023-05-03 20:39:36

java 中靜態內部類欄位什麼時候初始化是在外部類載入的時候就初始化嗎

首先分析下名字:靜態內部類
靜態是static。靜態的方法或者參數是隨著類的載入而產生的(感覺應該是JVM啟動時static屬性就載入了。)。這就是為什麼不用實例化類,就可以調用它的原因。
內部類:用內部類是因為內部類與所在外部類有一定的關系,往往只有該外部類調用此內部類。其他類不會調用。所以沒必要另寫一個類。外部類可以調用內部類。而內部類不能調用外部類的方法。
所以我覺得
靜態內部類中的屬性,方法,是在外部類載入的時候初始化的。
希望對您有幫助。如果有問題請自行
谷歌
度娘.

② 什麼是類的載入何時載入

當程序主動使用某個類時,如果該類還未被載入到攔槐內存中,系統會通過載入,連接,初始化三個步驟來對該類進行初始化,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類載入就一定要初始化么

類昌瞎載入 也就是把這個類宴迅敏實例化載入到內存中

而初始化也就是實例化

可能你想說的是聲明定義
如 Object obj; 這里並沒有進晌枝行初始化 ,只是申請到了一段地址

④ 北大青鳥java培訓:創建新對象的兩種方式

隨著互聯網編程開發技術的發展,編程開發語言已經由面向程序發展成為了面向對象的編程。
今天,我們就從兩個方面來了解一下,java編程語言中如何創建新對象的。
java在new一個對象的時候,會先查看對象所屬的類有沒有被載入到內存,如果沒有的話,就會先通過類的全限定名來載入。
載入並初始化類完成後,再進行對象的創建工作。
我們先假設是一次使用該類,這樣的話new一個對象就可以分為兩個過程:載入並初始化類和創建對象。
一、類載入過程(一次使用該類)java是使用雙親委派模型來進行類的載入的,所以在描述類載入過程前,我們先看一下它的工作過程:雙親委託模型的工作過程是:如果一個類載入器(ClassLoader)收到了類載入的請求,它先不會自己去嘗試載入這個類,而是把這個請求委託給父類載入器去完成,每一個層次的類載入器都是如此,因此所有的載入請求終都應該傳送到頂層的啟動類載入器中,只有當父類加搏源載器反饋自己無法完成這個載入請求(它的搜索范圍中沒有找到所需要載入的類)時,子載入器才會嘗試自己去載入。
使用雙親委託機制的基襲態好處是:能夠有效確保一個類的全局性,當程序中出現多個限定名相同的類時,類載入器在執行載入時,始終只會載入其中的某一個類。
1、載入由類載入器負責根據一個類的全限定名來讀取此類的二進制位元組流到JVM內部,並存儲在運行時內存區的方法區,然後將其轉換為一個與目標類型對應的java.lang.Class對象實例2、驗證格式驗證:驗證是否符合class文件規范語義驗證:檢查一個被標記為final的類型是否包含子類;檢查一個類中的final方法是否被子類進行重寫;確保父類和子類之間沒有不兼容的一些方法聲明(比如方法簽名相同,但方法的返回值不同)操作驗證:在操作數棧中的數據必須進行正確的操作,對常量池中的各種符號引用執行驗證(通常在解析階段執行,檢查是否可以通過符號引用中描述的全限定名定位到指定類型上,以及類成員信息的訪問修飾符是否允許訪問等)3、准備為類中的所有靜態變數分配內存空間,並為其設置一個初始值(由於還沒有產生對象,實例變數不在此操作范圍內)被final修飾的static變數(常量),會直接賦值;4、解析將常量池中的符號引用轉為直接引用(得到類或者欄位、方法在禪廳內存中的指針或者偏移量,以便直接調用該方法),這個可以在初始化之後再執行。
解析需要靜態綁定的內容。
//所有不會被重寫的方法和域都會被靜態綁定以上2、3、4三個階段又合稱為鏈接階段,鏈接階段要做的是將載入到JVM中的二進制位元組流的類數據信息合並到JVM的運行時狀態中。
5、初始化(先父後子)4.1為靜態變數賦值4.2執行static代碼塊注意:static代碼塊只有jvm能夠調用如果是多線程需要同時初始化一個類,僅僅只能允許其中一個線程對其執行初始化操作,其餘線程必須等待,只有在活動線程執行完對類的初始化操作之後,才會通知正在等待的其他線程。
因為子類存在對父類的依賴,所以類的載入順序是先載入父類後載入子類,初始化也一樣。
不過,父類初始化時,子類靜態變數的值也有有的,是默認值。
終,方法區會存儲當前類類信息,包括類的靜態變數、類初始化代碼(定義靜態變數時的賦值語句和靜態初始化代碼塊)、實例變數定義、實例初始化代碼(定義實例變數時的賦值語句實例代碼塊和構造方法)和實例方法,還有父類的類信息引用。
二、創建對象1、在堆區分配對象需要的內存分配的內存包括本類和父類的所有實例變數,但不包括任何靜態變數2、對所有實例變數賦默認值將方法區內對實例變數的定義拷貝一份到堆區,然後賦默認值3、執行實例初始化代碼初始化順序是先初始化父類再初始化子類,初始化時先執行實例代碼塊然後是構造方法4、如果有類似於Childc=newChild()形式的c引用的話,在棧區定義Child類型引用變數c,然後將堆區對象的地址賦值給它需要注意的是,廣西IT培訓http://www.kmbdqn.cn/發現每個子類對象持有父類對象的引用,可在內部通過super關鍵字來調用父類對象,但在外部不可訪問

⑤ 關於JAVA中的初始化及類的載入

你不太可能完全用代碼證明類載入的動作,因為在你用這個類之前(也就是你想要開始證明一個類載入的過程時)她已經載入了。

現在來說,靜態成員會和類載入的時候一起初始化,所以最多最多也只能通過靜態成員來證明類的載入。

那麼問題就是如何在靜態成員被初始化的時候提示消息,兩種方法:

第一種是使用靜態的欄位成員,此成員指定為一個對象初始化,在這個初始化對象的構造函數做通知。代碼:
public class StaticLoad{
public static LoadNotify = new LoadNotify();
}

public class LoadNotify{
public LoadNotify(){
System.out.println("Class is Loaded");
}
}
那麼使用StaticLoad類的時候,會打出Class is Loaded證明類載入的時候初始化了static成員,調用多次也僅會打出一次。

第二種是使用靜態塊,代碼:
public class StaticLoad{
public static LoadNotify = new LoadNotify();
static {
System.out.println("Class is Loaded");
}
}
此時類載入時也會執行靜態塊中的代碼。

這是進行當類載入的時候進行通知的方法,你可以自己寫一寫代碼,他們僅會打出一次。

對於類的載入順序,網上有詳細的,我這里只說一些簡單的:
首先需要用到一個類的時候,虛擬機會從classpath讀取此類的代碼,到內存的類的代碼存儲區,然後對於每一個靜態欄位開辟一個存儲區,再存儲方法的代碼。接著初始化類,所有的靜態成員按照順序初始化(按代碼聲明順序從上到下開始),當需要載入其他類的時候載入其他的類。然後完成初始化供虛擬機使用。
當實例化一個類的時候,如果需要載入的話,會按照上面的順序載入,然後在內存中分配所有實例欄位的空間,接著調用構造函數,其中構造函數會(顯示或隱式的)調用父類構造函數(此過程向上遞歸),然後執行剩下的構造代碼。最後返回實例化的對象的引用返回構造函數。

⑥ Java:類成員的初始化順序 類載入 疑問(如圖)

一段程序的完整執行過程是先編譯,然後載入到jvm,然後初始化,然後你才能使用(當然中間還有需要細節)。初始化是執行類構造器方法的過程,類構造器方法是由編譯器自動收集類中的所有類變數的賦值動作和靜態語句塊中的語句合並產生的(不是類的構造方法)。所以,簡而言之,一個類在初始化的時候,會先執行它的靜態代碼塊,當然,如果這個類有父類的話,同樣的道理,如果發現該父類沒有初始化,則需要先對其父類進行初始化,再對該類進行初始化。
至於一個類在什麼時候初始化,簡單的說,當程序第一次用到這個類時候就會對其進行初始化(前提是其沒有進行過初始化)。

⑦ Java類載入機制

每個開發人員對java.lang.ClassNotFoundExcetpion這個異常肯定都不陌生,這背後就涉及到了java技術體系中的類載入。Java的類載入機制是技術體系中比較核心的部分,雖然和大部分開發人員直接打交道不多,但是對其背後的機理有一定理解有助於排查程序中出現的類載入失敗等技術問題,對理解java虛擬機的連接模型和java語言的動態性都有很大幫助。電腦培訓就得好好的為大家介紹一下。

那麼什麼是類的載入?


類的載入指的是將類的.class文件中的二進制數據讀入到內存中,將其放在運行時數據區的方法區內,然後在堆區創建一個java.lang.Class對象,用納扮來封裝類在方法區內的數據結構。類的載入的最終產品是位於堆區中的Class對象,Class對象封裝了類在方法區內的數據結構,並且向Java程序員提供了訪問方法區內的數據結構的介面。


Java類載入機制


類載入器是Java語言的一個創新,也是Java語言流行的重要原因之一。它使得Java類可以被動態載入到Java虛擬機中並執行。類載入器從JDK1.0就出現了,最初是為了滿足JavaApplet的需要而開發出來的。JavaApplet需要從遠程下載Java類文件到瀏覽器中並執行。現在類載入器在Web容器和OSGi中得到了廣泛的使用,而類載入器並不需要等到某個類被「首次主動使用」時再載入它,JVM規范允許類載入器在預料某個類將要被使用時就預先載入它,如果在預先載入的過程中遇到了.class文件缺失或存在錯誤,類載入器必須在程序首次主動使用該類時才報告錯誤(LinkageError錯誤)如果這個類一直沒有被程序主動使用,那麼類載入器就不會報告錯誤。


類的生命周期


類載入的過程中包括有載入,驗證,准備,解析,初始化五個階段。而需要注意的是在這五個階段中,載入、驗證、准備和初始化這四個階段發生的順序是確定的,而解析階段則不一定,它在某些情況下可以在初始化階段之後開始,這是為了支持Java語言的運行時綁定(也成為動態綁定或晚期綁定)。另液搏外注意這里的幾個階段是按鬧茄祥順序開始,而不是按順序進行或完成,因為這些階段通常都是互相交叉地混合進行的,通常在一個階段執行的過程中調用或激活另一個階段。


閱讀全文

與java類載入與初始化相關的資料

熱點內容
微信聊天界面源碼 瀏覽:24
seo競價推廣點擊價格演算法公式 瀏覽:319
框架結構可以加密嗎 瀏覽:218
python編譯器怎麼清除 瀏覽:73
linux全局socks代理 瀏覽:611
php微信抽獎 瀏覽:771
壓縮演算法嵌入式移植 瀏覽:531
php新手小例子 瀏覽:233
按照醫生的演算法一周是幾天 瀏覽:805
三次b樣條曲線演算法 瀏覽:924
java7特性 瀏覽:555
愛山東app小學報名怎麼知道報沒報上 瀏覽:458
android獲取wifi信號 瀏覽:133
娜拉美妝app怎麼使用 瀏覽:760
有了源碼要買伺服器嗎 瀏覽:365
app怎麼查看自己的存款利息 瀏覽:515
碧藍安卓與b站有什麼區別 瀏覽:342
php靜態塊 瀏覽:719
ftpmget命令 瀏覽:475
源碼時代怎樣 瀏覽:415