免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
java中靜態(tài)語(yǔ)句塊、實(shí)例代碼塊、構(gòu)造器方法這3者的調(diào)用順序

1、分析:

1.1、在JVM類加載機(jī)制中,有講到:將類加載到JVM當(dāng)中后,才進(jìn)行類的初始化。所謂初始化階段,是指:根據(jù)程序員寫的代碼去初始化類變量和其他資源,這句話也可以這么說:初始化階段是執(zhí)行類構(gòu)造器()方法的過程。()方法是編譯器自動(dòng)收集類中的所有類變量和靜態(tài)語(yǔ)句塊(static{})中的語(yǔ)句合并而成的。知道這一點(diǎn)很重要,而()方法里面語(yǔ)句的順序由源程序代碼決定。()方法和類實(shí)例構(gòu)造器()方法是不同的。這一點(diǎn),可以通過調(diào)試代碼來驗(yàn)證,我用的是Mac版本的idea15,在屏幕的最下面一行,可以看到先執(zhí)行()方法,后執(zhí)行()方法。如圖:





1.2、調(diào)用完()方法后,才會(huì)執(zhí)行類的構(gòu)造函數(shù)()方法。涉及到構(gòu)造方法的調(diào)用、實(shí)例代碼塊的執(zhí)行。同時(shí),實(shí)例化幾次類,則進(jìn)行“實(shí)例代碼塊”和“構(gòu)造器方法”的幾次調(diào)用,并且,“實(shí)例代碼塊”優(yōu)先于“構(gòu)造器方法”的調(diào)用。



2、驗(yàn)證代碼:

/** * Created by cxh on 17/07/21. */public class Main { //實(shí)例化代碼塊.每次生成類實(shí)例,都會(huì)執(zhí)行.并且,實(shí)例化代碼塊的執(zhí)行 優(yōu)先于 構(gòu)造器. { System.out.println('blockA'); } //靜態(tài)語(yǔ)句塊,在類初始化時(shí),僅僅執(zhí)行一次. static{ System.out.println('blockB'); } //類實(shí)例 public static Main t1 = new Main(); //構(gòu)造器方法 Main(){ System.out.println('constructor'); } public static void main(String[] args) { //類實(shí)例 Main t2 = new Main(); }}

輸出結(jié)果:

blockBblockAconstructorblockAconstructorProcess finished with exit code 0


3、說明:

3.1、名字上的區(qū)分

()方法的名字:類構(gòu)造器方法

()方法的名字:  實(shí)例構(gòu)造器方法  or  類的構(gòu)造函數(shù)

3.2、說一下()方法

3.2.1、()方法中的內(nèi)容由編譯器自動(dòng)收集類中的2類東西組成:類變量和靜態(tài)語(yǔ)句塊中的語(yǔ)句。在()方法中各個(gè)語(yǔ)句的排列順序和java代碼順序保持一致。這樣的順序也決定了:靜態(tài)語(yǔ)句塊中只能訪問靜態(tài)語(yǔ)句塊之前的靜態(tài)變量;定義在它后面的變量,是不能被訪問的,但是可以為其賦值。如:


修改后代碼:

/** * Created by cxh on 17/07/21. */public class Main { static int a=0; static{ System.out.println('blockB'); System.out.println(a); //System.out.println(b); //報(bào)錯(cuò):Illegal forward reference b=3; } static int b=1; public static void main(String[] args) { //類實(shí)例 Main t2 = new Main(); System.out.println('b:'+b); System.out.println('a:'+a); }}


運(yùn)行結(jié)果:
blockB0b:1a:0

3.2.2、()方法與類的構(gòu)造函數(shù)(or 說實(shí)例構(gòu)造器方法()方法)不同。它不需要顯示的調(diào)用父類構(gòu)造器,虛擬機(jī)會(huì)保證在子類的()方法執(zhí)行之前,父類的()已經(jīng)之行完畢。因此在虛擬機(jī)中第一個(gè)被執(zhí)行的()方法的類肯定是java.lang.Object。

3.2.3、由于父類的()方法先執(zhí)行,也就意味著父類中定義的靜態(tài)語(yǔ)句塊     先于    子類的變量賦值操作。

3.2.4、()對(duì)于類和接口來說,并不是必需的。因?yàn)槿绻粋€(gè)類中沒有靜態(tài)語(yǔ)句塊,也沒有對(duì)類變量的賦值操作,那么編譯器可以不為這個(gè)類生成()方法。

3.2.5、接口中不能使用靜態(tài)語(yǔ)句塊,但仍然有變量初始化的賦值操作。因此接口和類一樣都會(huì)生成()。只有當(dāng)父接口中定義的變量使用是,父接口才會(huì)初始化。另外,接口的實(shí)現(xiàn)類在初始化時(shí),也一樣不會(huì)執(zhí)行接口的()方法。

3.2.6、虛擬機(jī)會(huì)保證一個(gè)類的()方法在多線程環(huán)境中被正確加鎖、同步,如果多個(gè)線程同時(shí)去初始化一個(gè)類,那么只會(huì)有一個(gè)線程去執(zhí)行這個(gè)類的()方法,其他線程都需要阻塞等待,直到活動(dòng)線程執(zhí)行()方法完畢。如果在一個(gè)類中的()方法有很耗時(shí)的操作,就可能造成多個(gè)線程阻塞,在實(shí)際應(yīng)用中,這種阻塞是很隱蔽的。

注:需要注意的是,其他線程雖然會(huì)被阻塞,但如果執(zhí)行()方法的那條線程退出()方法后,其他線程不會(huì)再執(zhí)行()方法。同一個(gè)類加載器,一個(gè)類型只會(huì)初始化一次。

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Java中的繼承與靜態(tài)static等的執(zhí)行先后順序的面試題
Java中普通代碼塊,構(gòu)造代碼塊,靜態(tài)代碼塊區(qū)別
Java:類中代碼的執(zhí)行順序
part2-對(duì)象及其內(nèi)存管理
怎么一本正經(jīng)地秀技
類加載、對(duì)象實(shí)例化知識(shí)點(diǎn)一網(wǎng)打盡
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服