類的主動使用和被動使用

wojiaoao發表於2022-02-23

即判斷是否執行 <clinit> 方法

被動使用有 可能會載入類 (JVM規範裡沒有說明),根據不同虛擬機器實現,如果在載入的過程中,遇到了.class檔案的缺失或者存在錯誤,類載入器只會在首次主動使用它們時才會報錯,如果一直沒有主動使用,則不會報錯

主動

一,使用new關鍵字或者通過反射、克隆、反序列化

二,呼叫類的靜態方法。

三,當使用類、介面的靜態欄位時(final修飾特殊考慮)。

四,當使用java.lang.reflect包中的方法反射類的方法時。

五,當初始化子類時,如果發現其父類還沒有進行過初始化,則需要先觸發父類的初始化

interface Parent {
Thread thread = new Thread(){ //匿名內部類
{
System.out.println("Thread...Parent");
}
};
}
class Child implements Parent {
public static int b = 5;
}
public class Test04 {
public static void main(String[] args) {
System.out.println(Child.b);
}
}
//介面繼承或者實現介面類,只有當程式首次使用特定介面的靜態欄位時,才會導致該介面的初始化,而且是引用型別的
//例子中初始化Chlid但並沒有初始化父介面。

六,如果一個介面定義了default方法,那麼直接實現或者間接實現該介面的類的初始化,該介面要在其之前被初始化。

interface Parent {
Thread thread = new Thread(){ //匿名內部類
{
System.out.println("Thread...Parent");
}
};
default void a(){
System.out.println("dafsdaf");
}
}
class Child implements Parent {
}
public class Test04 {
public static void main(String[] args) {
Child child=new Child();
}
}

七,jvm啟動時被標明為啟動類的類(如Java Test、main方法所在的類)

http://ds.163.com/article/62150d168d5cee00019c4774/

http://ds.163.com/feed/62150d168d5cee00019c4774/

http://ds.163.com/article/62150d2da1ca540001b71682/

http://ds.163.com/feed/62150d2da1ca540001b71682/




來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/40011/viewspace-2857086/,如需轉載,請註明出處,否則將追究法律責任。

相關文章