国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

類初始化簡析

2019-11-11 04:51:30
字體:
供稿:網(wǎng)友

先看一個(gè)網(wǎng)上的例子:

public class SingleTon { PRivate static SingleTon singleTon = new SingleTon(); public static int count1; public static int count2 = 0; private SingleTon() { count1++; count2++; } public static void main(String[] args) { System.out.println(count1); System.out.println(count2); }}

打印:

10

沒有疑問,就不必往下看了,估計(jì)你已經(jīng)懂了。可能很多人大意之下會(huì)認(rèn)為都是1,我就是其中之一。 我們簡單回顧下沒有繼承基類的簡單類的初始化過程: 類被加載->分配內(nèi)存空間->靜態(tài)初始化->實(shí)例初始化 其中靜態(tài)初始化和實(shí)例初始化是有序自上而下的,看到這里應(yīng)該已經(jīng)明白了吧。 我們還是簡單說明白,類加載的時(shí)候基本類型count1和count2都被自動(dòng)的初始化為0,然后執(zhí)行自上而下執(zhí)行靜態(tài)初始化,靜態(tài)初始化new SingleTon()最先執(zhí)行,2個(gè)值都變?yōu)榱?,然而count2又被重新賦值了,重新變?yōu)榱?。 我們來看下javap編譯后的匯編看看:

Constant pool://常量池 。。。省略。。。 #18 = Fieldref #1.#19 // reusing/SingleTon.count2:I 。。。省略。。。 Code: stack=2, locals=0, args_size=0 0: new #1 // class reusing/SingleTon 3: dup 4: invokespecial #13 // Method "<init>":()V //實(shí)例化在前 7: putstatic #16 // Field singleTon:Lreusing/SingleTon; 10: iconst_0 //常量0入棧 11: putstatic #18 // Field count2:I //為靜態(tài)域賦值 14: return }

和我們分析得出的結(jié)果一模一樣。 如果是實(shí)例域,有將如何初始化,我們看代碼:

public class SingleTon { public int count1; public int count2 = 0; public SingleTon() { }}

進(jìn)行javap看看:

public class polymorphism.SingleTon { public int count1; public int count2; public polymorphism.SingleTon(); Code: 0: aload_0 1: invokespecial #11 // Method java/lang/Object."<init>":()V 4: aload_0 5: iconst_0 6: putfield #13 // Field count2:I //實(shí)例域count2,說明實(shí)例域和構(gòu)造器共同完成實(shí)例初始化 9: return }

通過上面的分析,我們知道,實(shí)例域初始化是類實(shí)例化的一部分,那么完整的類實(shí)例化順序應(yīng)該如下:

這里寫圖片描述


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 遂宁市| 太保市| 封开县| 江川县| 平山县| 怀来县| 平果县| 伊春市| 巴林左旗| 防城港市| 常德市| 迭部县| 台东县| 曲沃县| 安庆市| 河曲县| 施甸县| 邓州市| 辽阳市| 南漳县| 沙河市| 湖北省| 田林县| 石泉县| 北票市| 开化县| 洪湖市| 贵溪市| 定州市| 麦盖提县| 大宁县| 达州市| 林芝县| 北辰区| 和田市| 富阳市| 桐乡市| 泽州县| 丰镇市| 乐安县| 乌鲁木齐县|