第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

Java初始化和實(shí)例化順序

Java初始化和實(shí)例化順序

翻閱古今 2019-07-15 16:52:54
Java初始化和實(shí)例化順序我試圖將JVM中的初始化和實(shí)例化過程拼湊在一起,但是JLS在一些細(xì)節(jié)上有點(diǎn)遲鈍,所以如果有人介意澄清一些細(xì)節(jié),我們將不勝感激。到目前為止,這就是我所能找到的。初始化遞歸初始化類的靜態(tài)最終變量及其編譯時(shí)間常數(shù)的接口。退出遞歸,按文本順序處理靜態(tài)塊和靜態(tài)字段。實(shí)例化遞歸初始化編譯時(shí)間常數(shù)的類的最終實(shí)例變量。退出遞歸處理,按文本順序處理非靜態(tài)塊和實(shí)例字段,在返回時(shí)將它們放在構(gòu)造函數(shù)的前面。好了,現(xiàn)在開始提問。接口是否按聲明順序處理?接口是否在單獨(dú)的遞歸堆棧中處理?如果是,是否在超類之前或之后處理接口?(B)如果是,我是否正確地推斷其中一個(gè)或另一個(gè)(Interface或Superclass)在其他編譯時(shí)常量之前初始化了它的非編譯時(shí)常數(shù)字段。在這個(gè)過程中,調(diào)用非默認(rèn)的超級(jí)()構(gòu)造函數(shù)扮演什么角色?我的結(jié)論有錯(cuò)嗎?我有沒有遺漏其他關(guān)鍵細(xì)節(jié)?
查看完整描述

2 回答

?
慕標(biāo)5832272

TA貢獻(xiàn)1966條經(jīng)驗(yàn) 獲得超4個(gè)贊

區(qū)分類的初始化和對(duì)象的初始化非常重要。

類初始化

初始化類或接口。第一次訪問,通過分配編譯時(shí)間常數(shù)字段,然后遞歸初始化超類(如果尚未初始化),然后處理靜態(tài)初始化器(其中包括非編譯時(shí)間常數(shù)的靜態(tài)字段的初始化程序)。

正如您已經(jīng)注意到的,類的初始化本身并不會(huì)觸發(fā)它實(shí)現(xiàn)的接口的初始化。因此,接口在第一次訪問時(shí)被初始化,通常是通過讀取非編譯時(shí)間常數(shù)的字段進(jìn)行初始化。..此訪問可能發(fā)生在初始化器的計(jì)算過程中,從而導(dǎo)致遞歸初始化。

還值得注意的是,初始化不是通過訪問作為編譯時(shí)間常量的字段來觸發(fā)的,因?yàn)檫@些字段是在編譯時(shí)間:

對(duì)常量變量(§4.12.4)的字段的引用必須在編譯時(shí)解析為由常量變量的初始化器表示的值V。

如果這樣的字段是靜態(tài)的,那么在二進(jìn)制文件中的代碼中不應(yīng)該存在對(duì)該字段的引用,包括聲明該字段的類或接口。這樣的字段必須始終看起來已經(jīng)初始化(§12.4.2);字段的缺省初始值(如果與V不同)絕不能被觀察到。

如果這樣的字段是非靜態(tài)的,那么除了包含字段的類之外,二進(jìn)制文件中的代碼中不應(yīng)該存在對(duì)字段的引用。(它將是一個(gè)類,而不是一個(gè)接口,因?yàn)榻涌谥挥徐o態(tài)字段。)類應(yīng)該有代碼,以便在實(shí)例創(chuàng)建期間將字段的值設(shè)置為V(§12.5)。

對(duì)象初始化

對(duì)象被初始化。每當(dāng)創(chuàng)建新對(duì)象時(shí),通常通過計(jì)算類實(shí)例創(chuàng)建表達(dá)式。這方面的進(jìn)展如下:

  1. 將構(gòu)造函數(shù)的參數(shù)分配給此構(gòu)造函數(shù)調(diào)用的新創(chuàng)建的參數(shù)變量。

  2. 如果該構(gòu)造函數(shù)以同一個(gè)類中的另一個(gè)構(gòu)造函數(shù)的顯式構(gòu)造函數(shù)調(diào)用(§8.8.7.1)開始(使用此方法),則使用這五個(gè)步驟遞歸地計(jì)算參數(shù)和處理構(gòu)造函數(shù)調(diào)用。如果構(gòu)造函數(shù)調(diào)用突然完成,則此過程出于同樣的原因突然完成;否則,繼續(xù)執(zhí)行步驟5。

  3. 此構(gòu)造函數(shù)不以同一類中的另一個(gè)構(gòu)造函數(shù)的顯式構(gòu)造函數(shù)調(diào)用開始(使用此方法)。如果此構(gòu)造函數(shù)用于對(duì)象以外的類,則此構(gòu)造函數(shù)將以超類構(gòu)造函數(shù)的顯式或隱式調(diào)用(使用超級(jí))開始。使用這五個(gè)步驟遞歸地評(píng)估超類構(gòu)造函數(shù)調(diào)用的參數(shù)和過程。如果構(gòu)造函數(shù)調(diào)用突然完成,則此過程出于同樣的原因突然完成。否則,繼續(xù)執(zhí)行步驟4。

  4. 為該類執(zhí)行實(shí)例初始化器和實(shí)例變量初始化器,將實(shí)例變量初始化器的值按從左到右的順序分配給相應(yīng)的實(shí)例變量,這些變量在類的源代碼中以文本形式出現(xiàn)。如果執(zhí)行這些初始化程序中的任何一個(gè)都會(huì)導(dǎo)致異常,那么將不再處理其他初始化器,并且該過程在相同的異常下突然完成。否則,繼續(xù)執(zhí)行步驟5。

  5. 執(zhí)行此構(gòu)造函數(shù)主體的其余部分。如果該執(zhí)行突然完成,則此過程出于同樣的原因突然完成。否則,此過程將正常完成。

正如我們?cè)诓襟E3中所看到的,對(duì)超級(jí)構(gòu)造函數(shù)的顯式調(diào)用的存在只是改變了調(diào)用哪個(gè)超類構(gòu)造函數(shù)。


查看完整回答
反對(duì) 回復(fù) 2019-07-15
?
天涯盡頭無女友

TA貢獻(xiàn)1831條經(jīng)驗(yàn) 獲得超9個(gè)贊

下面是一個(gè)在對(duì)象創(chuàng)建過程中打印每個(gè)步驟順序的示例。

java:

import javax.annotation.PostConstruct;/**
 * Test steps of instance creation.
 * 
 * @author eric
 * @date Jan 7, 2018 3:31:12 AM
 */public class InstanceCreateStepTest {
    public static void main(String[] args) {
        new Sub().hello();
        System.out.printf("%s\n", "------------");
        new Sub().hello();
    }}class Base {
    static {
        System.out.printf("%s - %s - %s\n", "base", "static", "block");
    }
    {
        System.out.printf("%s - %s - %s\n", "base", "instance", "block");
    }

    public Base() {
        System.out.printf("%s - %s\n", "base", "constructor");
    }

    @PostConstruct
    public void init() {
        System.out.printf("%s - %s\n", "base", "PostConstruct");
    }

    public void hello() {
        System.out.printf("%s - %s\n", "base", "method");
    }}class Sub extends Base {
    static {
        System.out.printf("%s - %s - %s\n", "sub", "static", "block");
    }
    {
        System.out.printf("%s - %s - %s\n", "sub", "instance", "block");
    }

    public Sub() {
        System.out.printf("%s - %s\n", "sub", "constructor");
    }

    @PostConstruct
    public void init() {
        System.out.printf("%s - %s\n", "sub", "PostConstruct");
    }

    @Override
    public void hello() {
        // super.hello();
        System.out.printf("%s - %s\n", "sub", "method");
    }}

處決:

只需調(diào)用main方法,然后檢查輸出。

小貼士:

  • 標(biāo)記的方法

    @PostConstruct

    不會(huì)被調(diào)用,除非您在某個(gè)容器中調(diào)用它,例如

    Spring-boot

    ,因?yàn)樗蕾囉谀切┤萜鱽韺?shí)現(xiàn)注釋,如

    @PostConstruct.


查看完整回答
反對(duì) 回復(fù) 2019-07-15
  • 2 回答
  • 0 關(guān)注
  • 875 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)