日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

第七篇 JVM核心机制之JVM运行和类加载全过程(二)

發(fā)布時(shí)間:2023/11/27 生活经验 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第七篇 JVM核心机制之JVM运行和类加载全过程(二) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

分析:? ?

說明:

內(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。