乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

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

       chfxh 2017-07-25

      1、分析:

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





      1.2、調(diào)用完()方法后,才會(huì)執(zhí)行類(lèi)的構(gòu)造函數(shù)()方法。涉及到構(gòu)造方法的調(diào)用、實(shí)例代碼塊的執(zhí)行。同時(shí),實(shí)例化幾次類(lèi),則進(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í)例化代碼塊.每次生成類(lèi)實(shí)例,都會(huì)執(zhí)行.并且,實(shí)例化代碼塊的執(zhí)行 優(yōu)先于 構(gòu)造器. { System.out.println('blockA'); } //靜態(tài)語(yǔ)句塊,在類(lèi)初始化時(shí),僅僅執(zhí)行一次. static{ System.out.println('blockB'); } //類(lèi)實(shí)例 public static Main t1 = new Main(); //構(gòu)造器方法 Main(){ System.out.println('constructor'); } public static void main(String[] args) { //類(lèi)實(shí)例 Main t2 = new Main(); }}

      輸出結(jié)果:

      blockBblockAconstructorblockAconstructorProcess finished with exit code 0


      3、說(shuō)明:

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

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

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

      3.2、說(shuō)一下()方法

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


      修改后代碼:

      /** * 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) { //類(lèi)實(shí)例 Main t2 = new Main(); System.out.println('b:'+b); System.out.println('a:'+a); }}


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

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

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

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

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

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

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

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類(lèi)似文章 更多