在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

靜態代碼塊、構造代碼塊、構造函數及普通代碼塊的執行順序

科技綠洲 ? 來源:Java技術指北 ? 作者:Java技術指北 ? 2023-10-09 15:40 ? 次閱讀

Java中,靜態代碼塊、構造代碼塊、構造函數、普通代碼塊的執行順序是一個筆試的考點,通過這篇文章希望大家能徹底了解它們之間的執行順序。

1、靜態代碼塊

①、格式 在java類中(方法中不能存在靜態代碼塊)使用static關鍵字和{}聲明的代碼塊:

public class CodeBlock {
    static{
        System.out.println("靜態代碼塊");
    }
}

②、執行時機 靜態代碼塊在類被加載的時候就運行了,而且只運行一次,并且優先于各種代碼塊以及構造函數。如果一個類中有多個靜態代碼塊,會按照書寫順序依次執行。后面在比較的時候會通過具體實例來證明。

③、靜態代碼塊的作用 一般情況下,如果有些代碼需要在項目啟動的時候就執行,這時候就需要靜態代碼塊。比如一個項目啟動需要加載的很多配置文件等資源,我們就可以都放入靜態代碼塊中。

④、靜態代碼塊不能存在任何方法體中 這個應該很好理解,首先我們要明確靜態代碼塊是在類加載的時候就要運行了。我們分情況討論:

對于普通方法,由于普通方法是通過加載類,然后new出實例化對象,通過對象才能運行這個方法,而靜態代碼塊只需要加載類之后就能運行了。

對于靜態方法,在類加載的時候,靜態方法也已經加載了,但是我們必須要通過類名或者對象名才能訪問,也就是說相比于靜態代碼塊,靜態代碼塊是主動運行的,而靜態方法是被動運行的。

不管是哪種方法,我們需要明確靜態代碼塊的存在在類加載的時候就自動運行了,而放在不管是普通方法還是靜態方法中,都是不能自動運行的。

⑤、靜態代碼塊不能訪問普通變量 這個理解思維同上,普通變量只能通過對象來調用,是不能放在靜態代碼塊中的。

2、構造代碼塊

①、格式 在java類中使用{}聲明的代碼塊(和靜態代碼塊的區別是少了static關鍵字):

public class CodeBlock {
    static{
        System.out.println("靜態代碼塊");
    }
    {
        System.out.println("構造代碼塊");
    }
}

②、執行時機 構造代碼塊在創建對象時被調用,每次創建對象都會調用一次,但是優先于構造函數執行。需要注意的是,聽名字我們就知道,構造代碼塊不是優先于構造函數執行,而是依托于構造函數,也就是說,如果你不實例化對象,構造代碼塊是不會執行的。怎么理解呢?我們看看下面這段代碼:

public class CodeBlock {
    {
        System.out.println("構造代碼塊");
    }
     
    public CodeBlock(){
        System.out.println("無參構造函數");
    }
    public CodeBlock(String str){
        System.out.println("有參構造函數");
    }
}

我們反編譯生成的class文件:

圖片

如果存在多個構造代碼塊,則執行順序按照書寫順序依次執行。

③、構造代碼塊的作用 和構造函數的作用類似,都能對對象進行初始化,并且只要創建一個對象,構造代碼塊都會執行一次。但是反過來,構造函數則不一定每個對象建立時都執行(多個構造函數情況下,建立對象時傳入的參數不同則初始化使用對應的構造函數)。

利用每次創建對象的時候都會提前調用一次構造代碼塊特性,我們可以做諸如統計創建對象的次數等功能。

3、構造函數

1.構造函數的命名必須和類名完全相同。在java中普通函數可以和構造函數同名,但是必須帶有返回值;

2.構造函數的功能主要用于在類的對象創建時定義初始化的狀態。它沒有返回值,也不能用void來修飾。這就保證了它不僅什么也不用自動返回,而且根本不能有任何選擇。而其他方法都有返回值,即使是void返回值。盡管方法體本身不會自動返回什么,但仍然可以讓它返回一些東西,而這些東西可能是不安全的;

3.構造函數不能被直接調用,必須通過new運算符在創建對象時才會自動調用;而一般的方法是在程序執行到它的時候被調用的;

4.當定義一個類的時候,通常情況下都會顯示該類的構造函數,并在函數中指定初始化的工作也可省略,不過Java編譯器會提供一個默認的構造函數.此默認構造函數是不帶參數的。而一般的方法不存在這一特點;

4、普通代碼塊

普通代碼塊和構造代碼塊的區別是,構造代碼塊是在類中定義的,而普通代碼塊是在方法體中定義的。且普通代碼塊的執行順序和書寫順序一致。

public void sayHello(){
    {
        System.out.println("普通代碼塊");
    }
}

5、執行順序

靜態代碼塊>構造代碼塊>構造函數>普通代碼塊

public class CodeBlock {
    static{
        System.out.println("靜態代碼塊");
    }
    {
        System.out.println("構造代碼塊");
    }
    public CodeBlock(){
        System.out.println("無參構造函數");
    }
     
    public void sayHello(){
        {
            System.out.println("普通代碼塊");
        }
    }
     
    public static void main(String[] args) {
        System.out.println("執行了main方法");
         
        new CodeBlock().sayHello();;
        System.out.println("---------------");
        new CodeBlock().sayHello();;
    }
}

反編譯生成的class文件:

圖片

執行結果:

圖片

我們創建了兩個匿名對象,但是靜態代碼塊只是調用了一次。

6、父類和子類執行順序

對象的初始化順序:

首先執行父類靜態的內容,父類靜態的內容執行完畢后,接著去執行子類的靜態的內容,當子類的靜態內容執行完畢之后,再去看父類有沒有構造代碼塊,如果有就執行父類的構造代碼塊,父類的構造代碼塊執行完畢,接著執行父類的構造方法;父類的構造方法執行完畢之后,它接著去看子類有沒有構造代碼塊,如果有就執行子類的構造代碼塊。子類的構造代碼塊執行完畢再去執行子類的構造方法。

總之一句話,靜態代碼塊內容先執行,接著執行父類構造代碼塊和構造方法,然后執行子類構造代碼塊和構造方法。

父類:SuperClass.java

package com.ys.extend;
 
public class SuperClass {
    static{
        System.out.println("父類靜態代碼塊");
    }
    {
        System.out.println("父類構造代碼塊");
    }
    public SuperClass(){
        System.out.println("父類構造函數");
    }
}

子類:SubClass.java

package com.ys.extend;
 
public class SubClass extends SuperClass{
    static{
        System.out.println("子類靜態代碼塊");
    }
     
    {
        System.out.println("子類構造代碼塊");
    }
     
    public SubClass(){
        System.out.println("子類構造函數");
    }
     
}

測試:

public static void main(String[] args) {
    SubClass sb = new SubClass();
    System.out.println("------------");
    SubClass sb1 = new SubClass();
}
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • JAVA
    +關注

    關注

    19

    文章

    2973

    瀏覽量

    104901
  • 函數
    +關注

    關注

    3

    文章

    4341

    瀏覽量

    62799
  • 靜態
    +關注

    關注

    1

    文章

    29

    瀏覽量

    14566
  • 代碼
    +關注

    關注

    30

    文章

    4808

    瀏覽量

    68808
  • static
    +關注

    關注

    0

    文章

    33

    瀏覽量

    10383
收藏 人收藏

    評論

    相關推薦

    如何查看及更改函數/函數的調用環境

    模塊化設計的思想是把一些相似的功能(比如電機控制、閥控制)設計成函數函數,這樣就可以反復調用。其優點是:使程序架構更加清晰,避免重復編寫相似功能的代碼。不過可能會產生一個疑惑:既然
    的頭像 發表于 11-17 09:08 ?1010次閱讀
    如何查看及更改<b class='flag-5'>函數</b>/<b class='flag-5'>函數</b><b class='flag-5'>塊</b>的調用環境

    順序類型在中未連接

    :2677- 順序類型的節點在中未連接。警告:Xst:2677 - 順序類型的節點在中未連接。警告:Xst:2677- 順序類型的節點在
    發表于 03-07 14:06

    pid代碼執行的時間

    直接來干貨吧對于單片機來說 pid 是一個 每隔多長時間執行一次 的代碼 而這個時間通常就是積分時間我們令這個代碼快這個代碼
    發表于 09-03 07:51

    內存操作源代碼

    易語言是一門以中文作為程序代碼編程語言學習例程:易語言-內存操作
    發表于 06-06 17:01 ?1次下載

    一種新穎的復用代碼精確快速溯源方法

    。對于待溯源函數,依據函數代碼的simhash值快速發現相似代碼,繼而倒排索引潛在相似
    發表于 01-31 14:23 ?0次下載
    一種新穎的復用<b class='flag-5'>代碼</b>精確快速溯源方法

    python基礎:如何注釋代碼

    ? ? ? 大家好,又到了每日學習的時間了,最近博主在和python打交道,今天我們來聊一聊python一些基礎的東西,如何注釋代碼。 ? ? ? ?前言 ? ? ? ?編寫python程序有時候
    的頭像 發表于 12-26 22:03 ?5580次閱讀
    python基礎:如何注釋<b class='flag-5'>代碼</b><b class='flag-5'>塊</b>

    組合29個簡單Python代碼,自動發現新算法

    本文提出了一種基于演化算法的搜索策略,將其AAD中實現。AAD可以基于Python的子集作為語法結構,組合成復雜度相對較高的程序(循環,嵌套,嵌套函數調用等),并生成可執行的Python代碼
    的頭像 發表于 04-19 13:47 ?3553次閱讀

    基于差異性代碼克隆的代碼補全提示方法

    基于滑動窗口和帶誤匹配索引的匹配算法,尋找與待補全代碼相似的候選代碼,并對其進行特征提取、聚類和相關性排名,以此獲得候選代碼
    發表于 05-28 11:22 ?4次下載

    TIA Portal的程序保護功能實現

    注釋可見,而無法顯示接口參數Temp、Constant、程序代碼和網段注釋。此時被保護的程序也不能被修改。若使用正確的密碼打開程序時,可以顯示所有的接口參數、注釋和程序代碼。此時被
    的頭像 發表于 03-14 16:35 ?2735次閱讀
    TIA Portal的程序<b class='flag-5'>塊</b>保護功能實現

    SpringBoot如何實現啟動過程中執行代碼

    目前開發的SpringBoot項目在啟動的時候需要預加載一些資源。而如何實現啟動過程中執行代碼,或啟動成功后執行,是有很多種方式可以選擇,我們可以在static代碼
    的頭像 發表于 06-20 17:32 ?1471次閱讀

    PLC編程中OB、FC、FB、DB的使用原則

    西門子新加中包含組織(OB)、函數(FB)、函數(FC)、數據(DB)
    發表于 05-24 15:01 ?1.6w次閱讀
    PLC編程中OB<b class='flag-5'>塊</b>、FC<b class='flag-5'>塊</b>、FB<b class='flag-5'>塊</b>、DB<b class='flag-5'>塊</b>的使用原則

    Blockly@rduino:使用創建代碼

    電子發燒友網站提供《Blockly@rduino:使用創建代碼.zip》資料免費下載
    發表于 07-05 09:22 ?0次下載
    Blockly@rduino:使用<b class='flag-5'>塊</b>創建<b class='flag-5'>代碼</b>

    SIMATIC S7-1500 PLC函數(FB)及其應用

    函數(FB)屬于自己編程的。函數是一種“帶內存”的。分配數據
    的頭像 發表于 07-25 09:10 ?3382次閱讀
    SIMATIC S7-1500 PLC<b class='flag-5'>函數</b><b class='flag-5'>塊</b>(FB)及其應用

    調用SCL函數-事例

    在以下部分中,將在組織“Main” 中調用 SCL 函數“SCL_Best_before_date” 并互連輸入和輸出參數。
    的頭像 發表于 08-10 09:51 ?880次閱讀
    調用SCL<b class='flag-5'>函數</b><b class='flag-5'>塊</b>-事例

    Python中什么是語句

    條件判斷 語句 什么是語句呢? 語句是在條件為真(條件語句)時執行或者執行多次(循環語句)的一組語句。在
    的頭像 發表于 09-12 16:41 ?1033次閱讀
    主站蜘蛛池模板: 午夜精品在线视频| 一级一级一片免费高清| 四虎影片国产精品8848| 国产精品资源网| 黄色的视频在线免费观看| 好爽毛片一区二区三区四区 | 久久天天操| 久久天天躁夜夜躁狠狠85台湾| 加勒比在线免费视频| 性xxxxhd高清| 免费看男女做好爽好硬视频| 中国xxxxx高清免费看视频| 亚洲国内精品久久| 日韩种子| 精品四虎免费观看国产高清午夜| 国产精品最新资源网| 亚洲色图激情| 激情5月婷婷| 你懂的欧美| 国产一级特黄全黄毛片| sihu国产午夜精品一区二区三区| 天天澡天天干| 大片免费看| 久草男人天堂| 欧美同性精品xxxx| 久久国产免费观看精品1| 无遮挡一级毛片视频| 欧美日韩一区视频| 日本成本人三级在线观看2018| 嫩草影院地址一地址二| 成人在线免费| 毛片福利| 亚洲黄网免费| 四虎久久影院| 国产美女精品在线| 手机国产看片| 18欧美乱大交| 五月婷婷综合基地| 激情文学综合丁香| 欧洲国产精品精华液| 69女poren60|