成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

靜態(tài)代碼塊、構(gòu)造代碼塊、構(gòu)造器

shuibo / 1785人閱讀

摘要:因而,我們可以得出兩個(gè)結(jié)論在實(shí)例化子類對(duì)象時(shí),會(huì)執(zhí)行父類中所有未加載的構(gòu)造代碼塊和與子類相同的構(gòu)造器。

導(dǎo)讀

今天在做公司的項(xiàng)目,即統(tǒng)計(jì)實(shí)例化對(duì)象的存活個(gè)數(shù),例如以下的代碼

package com.zbystudy;

/**
 * Created By zby on 14:27 2019/4/12
 */
public class StaticFiled {

    public static int count = 0;

    private final int objCount = count++;

    public void printObjCount() {
        System.out.println("生成對(duì)象的個(gè)數(shù)為: " + objCount);
    }

    public static void main(String[] args) {
        for (int i = 0; i < 5; i++) {
            new StaticFiled().printObjCount();
        }
    }
}

輸出如圖所示:

在靜態(tài)代碼塊中加法

但是,我如果把代碼修改成這樣的:

public class StaticFiled {

   public static int count = 0;
    
   static {
       count++;
   }

    private final int objCount = count;

    。。。。。。
}

你會(huì)發(fā)現(xiàn),其只輸出1,為什么會(huì)這樣呢?會(huì)在下文講解。

在構(gòu)造代碼塊中加法

我們?cè)侔汛a修改成這樣的,結(jié)果又會(huì)不一樣:

public class StaticFiled {

    public static int count = 0;

    {
        count++;
    }
    
    private final int objCount = count;

    。。。。。。
}

其輸出結(jié)果是這樣的:

你會(huì)發(fā)現(xiàn),其跳過了0,而直接從1輸出,哈哈,很奇怪,對(duì)吧?我也覺著很奇怪,不過,會(huì)在下文作詳細(xì)介紹。

概念 構(gòu)造器 概念

假想我們沒有構(gòu)造器,但是我們還需要?jiǎng)?chuàng)建對(duì)象。因?yàn)?,java是通過消息來請(qǐng)求其他對(duì)象。要想請(qǐng)求對(duì)象,勢(shì)必向該對(duì)象發(fā)送一條消息,換句話說,可以把消息當(dāng)做某個(gè)特定對(duì)象的方法的調(diào)用。因而,對(duì)象還是很重要的。如果我們手動(dòng)去寫一個(gè)方法,即初始化創(chuàng)建對(duì)象的方法,這勢(shì)必會(huì)非常繁瑣的。

因而,我們就想到了java自帶的構(gòu)造器,其就是為了初始化對(duì)象的。

構(gòu)造代碼塊 概念

定義在類的成員位置上,使用"{}"括起來的代碼。構(gòu)造代碼塊會(huì)在每次類被調(diào)用,或者被實(shí)例化時(shí)就會(huì)被執(zhí)行。其優(yōu)于用以實(shí)例化對(duì)象的構(gòu)造器,如代碼所示:

/**
 * Created By zby on 16:49 2019/4/12
 */
public class Child{

    private String name;

    public Child(String name) {
        super(name);
        this.name = name;
    }

    public Child(){
        System.out.println("子類Child類的構(gòu)造器");
    }

    {
        System.out.println("子類Child類的   第一個(gè)  構(gòu)造代碼塊");
    }

    {
        System.out.println("子類Child類的  第二個(gè)  構(gòu)造代碼塊");
    }

    public static void main(String[] args) {
        new Child();
    }
}

其輸出結(jié)果如圖所示:

你會(huì)發(fā)現(xiàn),程序先執(zhí)行構(gòu)造代碼塊,然后再執(zhí)行構(gòu)造器,也就是說,構(gòu)造代碼塊的優(yōu)先級(jí)比構(gòu)造器的優(yōu)先級(jí)高。

這也解決了我們上面的問題,為什么程序的輸出會(huì)跳過0,直接從1開始輸出呢?因?yàn)椋覀兪状螌?shí)例化StaticFiled對(duì)象之前,構(gòu)造代碼塊就已執(zhí)行了一遍,此時(shí)的count是1,而不是0了。

同時(shí),你也會(huì)發(fā)現(xiàn),構(gòu)造代碼塊的執(zhí)行本身也是有先后順序的,先寫的先輸出,后寫的后輸出。

父類中的構(gòu)造代碼塊

但是,如果父類中有構(gòu)造代碼塊,子類輸出又是什么樣的呢?這樣,我們定義一個(gè)父類,如代碼所示:

public class Parent {

    private String name;

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
    
    public Parent() {
        System.out.println("父類Parent類的構(gòu)造器");
    }

    {
        System.out.println("父類Parent類的  第一個(gè)  構(gòu)造代碼塊");
    }

    {
        System.out.println("父類Parent類的  第一個(gè)  構(gòu)造代碼塊");
    }
}

我們?cè)俅螆?zhí)行Child類,觀察此時(shí)的輸出結(jié)果:

你會(huì)神奇的發(fā)現(xiàn),首先輸出父類的構(gòu)造代碼塊和構(gòu)造器,再次輸出子類的構(gòu)造代碼塊和構(gòu)造器。

因而,我們可以得出兩個(gè)結(jié)論:

在實(shí)例化子類對(duì)象時(shí),會(huì)執(zhí)行父類中所有未加載的構(gòu)造代碼塊和與子類相同的構(gòu)造器。

與子類相同的構(gòu)造器是什么意思?也就是說,如果我們把Child類中main方法,修改為這樣的: public static void main(String[] args){new Child("hhhh");},其輸出結(jié)果是這樣的:

父級(jí)和子類構(gòu)造代碼塊和構(gòu)造器之間的優(yōu)先級(jí):父級(jí)構(gòu)造代碼塊 --》 父級(jí)構(gòu)造器 --》 子類構(gòu)造代碼塊 --》 子類構(gòu)造器

靜態(tài)代碼塊 概念

靜態(tài)代碼塊只執(zhí)行一次,是在某個(gè)特定類第一次創(chuàng)建對(duì)象的時(shí)候執(zhí)行,此后不再執(zhí)行該靜態(tài)代碼塊,如代碼所示:

/**
 * Created By zby on 16:49 2019/4/12
 */
public class Child extends Parent {

    private String name;

    public Child() {
//        System.out.println("子類Child類的構(gòu)造器");
    }

    static {
        System.out.println("子類Child類的靜態(tài)代碼塊");
    }

    public static void main(String[] args) {
        for (int i=0;i<10;i++){
            new Child();
        }
    }
}

我們創(chuàng)建了10個(gè)子類對(duì)象,但只輸出一次靜態(tài)代碼塊中的數(shù)據(jù),結(jié)果如圖所示:

這也解決了上面的問題,為什么我們?cè)陟o態(tài)代碼塊中執(zhí)行這個(gè)指令: static {count++;} ,其輸出結(jié)果始終是 1 的原因了
父類靜態(tài)代碼塊

但是如果父類中存在靜態(tài)代碼塊,子類的輸出又是什么樣的呢?

在Parent類中添加代碼: static {System.out.println("父類Parent類的靜態(tài)代碼塊");}

在Child類中添加代碼: static {System.out.println("子類Child類的靜態(tài)代碼塊");}

我們執(zhí)行子類的代碼,得到的截圖:

由上圖,我們得出了結(jié)論:

首先執(zhí)行父類中的靜態(tài)代碼塊,再執(zhí)行子類的靜態(tài)代碼塊。
三者綜合應(yīng)用

父類中存在靜態(tài)代碼塊、構(gòu)造代碼塊、構(gòu)造器,子類中也存在靜態(tài)代碼塊、構(gòu)造代碼塊、構(gòu)造器,那么,輸出結(jié)果是什么樣的呢?

輸出結(jié)果如圖說示:

我們得出了這個(gè)結(jié)論三者的優(yōu)先級(jí):

父類靜態(tài)代碼塊 --》 子類靜態(tài)代碼塊 --》父類構(gòu)造代碼塊 --》 父類的構(gòu)造器 --》子類構(gòu)造代碼塊 --》子類構(gòu)造器
總結(jié)

我們只有明白了父類靜態(tài)代碼塊、子類靜態(tài)代碼塊、父類構(gòu)造代碼塊、父類的構(gòu)造器、子類構(gòu)造代碼塊、子類構(gòu)造器的關(guān)系,才能做更多的事情。就像是蓋房子,地基打得越牢固,蓋的房子越穩(wěn)定。否則,蓋得越高,危險(xiǎn)性越大。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/77561.html

相關(guān)文章

  • 6.java 代碼

    摘要:構(gòu)造塊優(yōu)先于構(gòu)造函數(shù)執(zhí)行,如果存在多個(gè)構(gòu)造代碼塊,則執(zhí)行順序按照定義的順序依次執(zhí)行。靜態(tài)代碼塊在中使用關(guān)鍵字聲明的代碼塊。同步代碼塊需要寫在方法中。 代碼塊 在java中用{}括起來的稱為代碼塊,代碼塊可分為以下四種: 普通代碼塊 構(gòu)造代碼塊 靜態(tài)代碼塊 同步代碼塊 普通代碼塊 在方法或語句中出現(xiàn)的{}就稱為普通代碼塊。普通代碼塊和一般語句的執(zhí)行順序由他們?cè)诖a中出現(xiàn)的次序決定,先...

    tuantuan 評(píng)論0 收藏0
  • Java代碼執(zhí)行順序

    摘要:沒有關(guān)鍵字修飾的如實(shí)例變量非靜態(tài)變量非靜態(tài)代碼塊初始化實(shí)際上是會(huì)被提取到類的構(gòu)造器中被執(zhí)行的,但是會(huì)比類構(gòu)造器中的代碼塊優(yōu)先執(zhí)行到,非靜態(tài)實(shí)例變量非靜態(tài)代碼塊的地位是相等的,它們將按順序被執(zhí)行。 閱讀原文:Java代碼執(zhí)行順序 程序中代碼執(zhí)行的順序非常重要,稍有不慎便會(huì)是程序運(yùn)行出錯(cuò),那么我將結(jié)合實(shí)例來分析代碼中的執(zhí)行。 名詞解釋 首先了解幾個(gè)名詞: 非靜態(tài)代碼塊 直接由 { } 包起...

    hosition 評(píng)論0 收藏0
  • Java基礎(chǔ)知識(shí)整理之代碼

    摘要:代碼塊我們主要觀察普通代碼塊構(gòu)造塊靜態(tài)塊的主要作用。代碼實(shí)例構(gòu)造方法類的構(gòu)造方法將代碼塊寫在了類里面類的構(gòu)造塊控制臺(tái)輸出類的構(gòu)造塊類的構(gòu)造方法此時(shí)實(shí)例化類對(duì)象時(shí),雖然執(zhí)行的是類的構(gòu)造方法,但是構(gòu)造塊里面的代碼也執(zhí)行了。 代碼塊 我們主要觀察普通代碼塊、構(gòu)造塊、靜態(tài)塊的主要作用。 在程序編寫之中可以直接使用{} 定義一段語句,那么根據(jù)此部分定義的位置以及關(guān)鍵字的不同可以分為以下幾種: ...

    shery 評(píng)論0 收藏0
  • JAVA繼承時(shí)父類子類都有靜態(tài)代碼構(gòu)造代碼時(shí)輸出順序問題

    摘要:父類,子類子類方法三者中有同名變量時(shí),調(diào)用子類方法輸出,輸出,為子類方法中的值,表示子類中的值,表示父類中的值。靜態(tài)代碼塊構(gòu)造代碼塊構(gòu)造方法靜態(tài)代碼塊構(gòu)造代碼塊構(gòu)造方法父類和子類都有靜態(tài)代碼塊,構(gòu)造代碼塊,構(gòu)造方法,初始化子類對(duì)象。 package cat1; class fu{ public int num=10; public fu() { Sy...

    寵來也 評(píng)論0 收藏0
  • 一道面試題引發(fā)的思考:(1)

    這是網(wǎng)易2015校招Java面試題,直接上題目。 題目 package com.mousycoder.staticTest; public class HelloB extends HelloA { public HelloB() { System.out.println(HelloB); } { System.out.println(I...

    tommego 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<