Java類何時以及如何加載和初始化?

在Java中,您首先要編寫一個.java文件,然後在編譯期間將其編譯爲.class文件。Java能夠在運行時加載類。困惑是“負載”和“初始化”之間的區別是什麼。Java類何時以及如何加載和初始化?通過使用下面的簡單示例可以清楚地說明。
說“上課”是什麼意思?
首先將C / C ++編譯爲本機代碼,然後在編譯後需要鏈接步驟。鏈接的作用是組合來自不同位置的源文件並形成可執行程序。Java不會這樣做。將Java加載到JVM後,就完成了Java的類似鏈接步驟。
不同的JVM以不同的方式加載類,但是基本規則是僅在需要時才加載類。如果所加載的類還需要其他一些類,則它們也將被加載。加載過程是遞歸的。
什麼時候以及如何加載Java類?
在Java中,加載策略由ClassLoader處理。以下示例顯示瞭如何以及何時爲簡單程序加載類。
TestLoader.java
package compiler;public class TestLoader {
public static void main(String[] args) {
System.out.println(“test”);
}}
A.Java
package compiler;public class A {
public void method(){
System.out.println(“inside of A”);
}}
這是eclipse中的目錄層次結構:

通過運行以下命令,我們可以獲得有關每個已加載類的信息。“ -verbose:class”選項顯示有關每個已加載類的信息。
java -verbose:class -classpath / home / ron / workspace / UltimateTest / bin /編譯器.TestLoader
部分輸出:

[從/usr/local/java/jdk1.6.0_34/jre/lib/rt.jar加載sun.misc.JavaSecurityProtectionDomainAccess。
[從/usr/local/java/jdk1.6.0_34/jre/lib/rt.jar加載的java.security.ProtectionDomain $ 2]
[從/usr/local/java/jdk1.6.0_34/jre/lib/rt.jar加載的java.security.ProtectionDomain $ Key]
[從/usr/local/java/jdk1.6.0_34/jre/lib/rt.jar加載的java.security.Principal]
[從文件:/ home / xiwang / workspace / UltimateTest / bin /中加載的compiler.TestLoader。]
測試
[從/usr/local/java/jdk1.6.0_34/jre/lib/rt.jar加載java.lang.Shutdown]
[從/usr/local/java/jdk1.6.0_34/jre/lib/rt.jar加載java.lang.Shutdown $ Lock]
現在,如果我們將TestLoader.java更改爲:
包 編譯器; 公共 類 TestLoader {
公共 靜態 void main (String [ ] args ) {
系統。出來。println (“測試” );
A a = 新 A ();
一個。方法();
} }
並再次運行相同的命令,輸出將是:
[從/usr/local/java/jdk1.6.0_34/jre/lib/rt.jar加載sun.misc.JavaSecurityProtectionDomainAccess。
[從/usr/local/java/jdk1.6.0_34/jre/lib/rt.jar加載的java.security.ProtectionDomain $ 2]
[從/usr/local/java/jdk1.6.0_34/jre/lib/rt.jar加載的java.security.ProtectionDomain $ Key]
[從/usr/local/java/jdk1.6.0_34/jre/lib/rt.jar加載的java.security.Principal]
[從文件:/ home / xiwang / workspace / UltimateTest / bin /中加載的compiler.TestLoader。]
測試[從文件:/ home / xiwang / workspace / UltimateTest / bin /加載的編譯器.A]
在A裏面
[從/usr/local/java/jdk1.6.0_34/jre/lib/rt.jar加載java.lang.Shutdown]
[從/usr/local/java/jdk1.6.0_34/jre/lib/rt.jar加載java.lang.Shutdown $ Lock]
我們可以看到以紅色突出顯示的差異。A.class僅在使用時加載。總而言之,將加載一個類:
當執行新的字節碼時。例如,SomeClass f = new SomeClass();
當字節碼靜態引用一個類時。例如,System.out。
Java類何時以及如何初始化?
首次使用類中的符號時,將初始化該類。加載類時,不會對其進行初始化。
JVM將按照文本順序初始化超類和字段,首先初始化靜態字段,最後是字段,並在初始化之前爲每個字段提供默認值。
Java類實例初始化是一個示例,顯示了字段,靜態字段和構造函數的執行順序。
最後,開發這麼多年我也總結了一套學習Java的資料與面試題,如果你在技術上面想提升自己的話,可以關注我,私信發送領取資料或者在評論區留下自己的聯繫方式,有時間記得幫我點下轉發讓跟多的人看到哦。在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章