第七篇 JVM核心机制之JVM运行和类加载全过程(二)
分析:? ?
說明:
內(nèi)存中存在棧、堆(放創(chuàng)建好的對(duì)象)、方法區(qū)(實(shí)際也是一種特殊堆)
1、JVM加載Demo01時(shí)候,首先在方法區(qū)中形成Demo01類對(duì)應(yīng)靜態(tài)數(shù)據(jù)(類變量、類方法、代碼…),同時(shí)在堆里面也會(huì)形成java.lang.Class對(duì)象(反射對(duì)象),代表Demo01類,通過對(duì)象可以訪問到類二進(jìn)制結(jié)構(gòu)。然后加載變量A類信息,同時(shí)也會(huì)在堆里面形成a對(duì)象,代表A類。
2、main方法執(zhí)行時(shí)會(huì)在棧里面形成main方法棧幀,一個(gè)方法對(duì)應(yīng)一個(gè)棧幀。如果main方法調(diào)用了別的方法,會(huì)在棧里面挨個(gè)往里壓,main方法里面有個(gè)局部變量A類型的a,一開始a值為null,通過new調(diào)用類A的構(gòu)造器,棧里面生成A()方法同時(shí)堆里面生成A對(duì)象,然后把A對(duì)象地址付給棧中的a,此時(shí)a擁有A對(duì)象地址。
3、當(dāng)調(diào)用A.width時(shí),調(diào)用方法區(qū)數(shù)據(jù)。?
當(dāng)類被引用的加載,類只會(huì)加載一次
?
類的主動(dòng)引用(一定會(huì)發(fā)生類的初始化)
①new一個(gè)類的對(duì)象
②調(diào)用類的靜態(tài)成員(除了final常量)和靜態(tài)方法
③使用java.lang.reflect包的方法對(duì)類進(jìn)行反射調(diào)用
④當(dāng)虛擬機(jī)啟動(dòng),java Demo01,則一定會(huì)初始化Demo01類,說白了就是先啟動(dòng)main方法所在的類
⑤當(dāng)初始化一個(gè)類,如果其父類沒有被初始化,則先初始化它父類
類的被動(dòng)引用(不會(huì)發(fā)生類的初始化)
①當(dāng)訪問一個(gè)靜態(tài)域時(shí),只有真正聲名這個(gè)域的類才會(huì)被初始化
②通過子類引用父類的靜態(tài)變量,不會(huì)導(dǎo)致子類初始化
③通過數(shù)組定義類的引用,不會(huì)觸發(fā)此類初始化
④引用常量不會(huì)觸發(fā)此類的初始化(常量在編譯階段就存入調(diào)用類的常量池中了)
?
1 public class Demo01 { 2 static{ 3 System.out.println("靜態(tài)初始化demo01"); 4 } 5 6 public static void main(String[] args) { 7 System.out.println("靜態(tài)初始化demo01.main"); 8 /*String str = "aaa"; 9 int a = 23435;*/ 10 //調(diào)用A類的方法 11 A a = new A(); 12 13 //通過反射調(diào)用 14 /* try { 15 Class.forName("com.zzp.A"); 16 } catch (ClassNotFoundException e) { 17 e.printStackTrace(); 18 }*/ 19 20 //注意打印出來的width的值和程序執(zhí)行的順序 21 //主動(dòng)引用 22 // System.out.println(a.width); 23 24 //被動(dòng)引用 25 // System.out.println(a.b); 26 27 //數(shù)組初始化 28 //A[] as = new A[10]; 29 30 System.out.println(B.width); 31 } 32 } 33 34 //創(chuàng)建一個(gè)B類,繼承A 35 class B extends A{ 36 static{ 37 System.out.println("靜態(tài)初始化B"); 38 } 39 } 40 41 42 class A extends A_Father{ 43 public static int width = 100; 44 public static final int b= 100; 45 static{ 46 System.out.println("靜態(tài)初始化A"); 47 width = 300; 48 } 49 public A(){ 50 System.out.println("創(chuàng)建A類的對(duì)象"); 51 } 52 } 53 54 class A_Father{ 55 static{ 56 System.out.println("靜態(tài)初始化A_Father"); 57 } 58 }
?
轉(zhuǎn)載于:https://www.cnblogs.com/zhangzhipeng001/p/9135690.html
總結(jié)
以上是生活随笔為你收集整理的第七篇 JVM核心机制之JVM运行和类加载全过程(二)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: node.js实现国标GB28181流媒
- 下一篇: 使用MS VS的命令来编译C++程序