Java類載入機制,java載入機制
java類載入機制類的生命週期
類的生命週期包括7個階段:載入 、驗證、準備、解析、初始化、使用和卸載
類的初始化情境類不初始化的情境情境一 :
通過子類引用父類的靜態變數時,不會導致子類的初始化過程
代碼如下:
public class SSClass{ static { System.out.println("SSClass"); }} public class SuperClass extends SSClass{ static { System.out.println("SuperClass init!"); } public static int value = 123; public SuperClass() { System.out.println("init SuperClass"); }}public class SubClass extends SuperClass{ static { System.out.println("SubClass init"); } static int a; public SubClass() { System.out.println("init SubClass"); }}public class NotInitialization{ public static void main(String[] args) { System.out.println(SubClass.value); }}
輸出的結果:
SSClass
SuperClass init!
123
情境二:
通過數組來引用類,不會觸發該類初始化 例如:SubClass[] array = new SubClass[10] 原因在於,這時候的位元組碼指令是newarray
情境三:
當類變數被final關鍵字修飾的時候,引用ConstanValue不會觸發該類初始化
原因:這種常量在類的準備階段已經存放在常量池裡了,調用和該類沒有太大關係
應用測試題
package com.zzjmay;public class TestJVM { public static void main(String[] args) { staticFunction(); } static TestJVM st = new TestJVM(); static { System.out.println("1"); } { System.out.println("2"); } TestJVM() { System.out.println("3"); System.out.println("a="+a+",b="+b); } public static void staticFunction(){ System.out.println("4"); } int a=110; static int b =112;}
輸出的結果是
2
3
a=110 ,b=0
1
4
注意:
對象初始化的步驟是先初始化成員變數,再初始化構造器
類初始化 按照代碼順序執行,如果存在嵌套對象初始化,先執行對象初始化
歡迎加入學習交流群569772982,大家一起學習交流。