欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java——對(duì)象初始化順序使用詳解

 更新時(shí)間:2017年04月14日 09:35:23   作者:lim_dev  
本篇文章介紹了,Java對(duì)象初始化順序的使用。需要的朋友參考下

一、 代碼塊的概念

在探究對(duì)象初始化順序之前,我們先通過(guò)代碼來(lái)了解一下代碼塊的概念。

class Test{
  public static String str1; //靜態(tài)字段

  public String str2;     //普通字段

  static{           
    //靜態(tài)代碼塊
  }

  {
    //構(gòu)造代碼塊
  }

  public Test() { 
    //構(gòu)造函數(shù)
  }
}

二、 創(chuàng)建子類對(duì)象時(shí),對(duì)象的初始化順序

1. 字段初始化、代碼塊和構(gòu)造函數(shù)的執(zhí)行順序

我們先看代碼和結(jié)果

public class CodeBlockTest {
  public static void main(String[] args) {
    Child child = new Child();
  }
}
class Father {
  public static String fatherStr1 = "fatherStr1(靜態(tài)字段初始化值)";

  public String fatherStr2 = "fatherStr2(字段初始化值)";
  static {
    System.out.println("父類靜態(tài)代碼塊:" + fatherStr1);
    fatherStr1 = "fatherStr1(靜態(tài)代碼塊賦值)";
  }
  {
    System.out.println("父類構(gòu)造代碼塊:" + fatherStr2);
    fatherStr2 = "fatherStr2(構(gòu)造代碼塊賦值)";
  }
  public Father() {
    System.out.println("父類構(gòu)造函數(shù)塊:" + fatherStr2);
    fatherStr2 = "fatherStr2(構(gòu)造函數(shù)賦值)";
  }
}
class Child extends Father {
  public static String childStr1 = "childStr1(靜態(tài)字段初始化值)";
  public String childStr2 = "childStr2(字段初始化值)";
  static {
    System.out.println("子類靜態(tài)代碼塊:" + childStr1);
    childStr1 = "childStr1(靜態(tài)代碼塊賦值)";
  }
  {
    System.out.println("子類構(gòu)造代碼塊:" + childStr2);
    childStr2 = "childStr2(構(gòu)造代碼塊賦值)";
  }
  public Child() {
    System.out.println("子類構(gòu)造函數(shù):" + childStr2);
    childStr2 = "childStr2(構(gòu)造函數(shù)賦值)";
  }
}
//  輸出結(jié)果:
//  父類靜態(tài)代碼塊:fatherStr1(靜態(tài)字段初始化值)
//  子類靜態(tài)代碼塊:childStr1(靜態(tài)字段初始化值)
//  父類構(gòu)造代碼塊:fatherStr2(字段初始化值)
//  父類構(gòu)造函數(shù)塊:fatherStr2(構(gòu)造代碼塊賦值)
//  子類構(gòu)造代碼塊:childStr2(字段初始化值)
//  子類構(gòu)造函數(shù):childStr2(構(gòu)造代碼塊賦值)

通過(guò)每執(zhí)行一個(gè)代碼塊或構(gòu)造函數(shù),輸出字段在上一代碼塊執(zhí)行后的值,以此來(lái)探究對(duì)象的初始化順序。

由目前的輸出結(jié)果可知,對(duì)于對(duì)象的初始化順序,我們可以得出以下結(jié)論:

1. 父類靜態(tài)字段初始化

2. 父類靜態(tài)代碼塊、子類靜態(tài)字段初始化 (接下來(lái)探究?jī)烧叩捻樞颍?/p>

3. 子類靜態(tài)代碼塊

4. 父類普通字段初始化

5. 父類構(gòu)造代碼塊

6. 父類構(gòu)造函數(shù)

7. 子類普通字段初始化

8. 子類構(gòu)造代碼塊

9. 子類構(gòu)造函數(shù)

2. 父類靜態(tài)代碼塊和子類靜態(tài)字段初始化的執(zhí)行順序

還是一樣,我們通過(guò)代碼的執(zhí)行結(jié)果來(lái)探究?jī)烧唛g的執(zhí)行順序。

public class CodeBloacTest2 {
  public static void main(String[] args) {
    Child child = new Child();
  }
}
class Father {
  public static String fatherStr = "(靜態(tài)字段初始化值)";
  static {
    System.out.println("父類靜態(tài)代碼塊:fatherStr" + fatherStr);
    fatherStr = "(靜態(tài)代碼塊賦值)";
  }
}
class Child extends Father {
  public static String childStr = fatherStr;
  static {
    System.out.println("子類靜態(tài)代碼塊:childStr = fatherStr" + childStr);
    childStr = "(靜態(tài)代碼塊賦值)";
  }
}
//  輸出結(jié)果:
//  父類靜態(tài)代碼塊:fatherStr(靜態(tài)字段初始化值)
//  子類靜態(tài)代碼塊:childStr = fatherStr(靜態(tài)代碼塊賦值)

我們?cè)谧宇愳o態(tài)字段childStr初始化的時(shí)候,賦的是父類靜態(tài)字段fatherStr的值。由輸出結(jié)果可知,childStr初始化后的值是父類靜態(tài)代碼塊執(zhí)行后賦予fatherStr的值。由此可知兩者的執(zhí)行順序?yàn)椋焊割愳o態(tài)代碼塊==>子類靜態(tài)字段初始化

三、 結(jié)論

父類靜態(tài)字段初始化

父類靜態(tài)代碼塊

子類靜態(tài)字段初始化

子類靜態(tài)代碼塊

父類普通字段初始化

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

父類構(gòu)造函數(shù)

子類普通字段初始化

子類構(gòu)造代碼塊

子類構(gòu)造函數(shù)

通過(guò)結(jié)論我們可以很明顯的看出:static字段、代碼塊的執(zhí)行順序優(yōu)先于非static字段、代碼塊。這是因?yàn)樵陟o態(tài)域是屬于類的,在類加載后就一直存在;而普通域需要?jiǎng)?chuàng)建對(duì)象才能訪問(wèn)。而在創(chuàng)建對(duì)象時(shí),需要先加載父類,然后再加載子類,因此父類的靜態(tài)字段初始化和靜態(tài)代碼塊執(zhí)行先于子類。

以上內(nèi)容希望對(duì)各位朋友有所幫助

相關(guān)文章

  • 淺談SpringBoot是如何實(shí)現(xiàn)日志的

    淺談SpringBoot是如何實(shí)現(xiàn)日志的

    這篇文章主要介紹了淺談SpringBoot是如何實(shí)現(xiàn)日志的,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • Java Volatile 變量詳解及使用方法

    Java Volatile 變量詳解及使用方法

    這篇文章主要介紹了Java Volatile 變量詳解及使用方法的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • SpringSession 請(qǐng)求與響應(yīng)重寫的實(shí)現(xiàn)

    SpringSession 請(qǐng)求與響應(yīng)重寫的實(shí)現(xiàn)

    這篇文章主要介紹了SpringSession 請(qǐng)求與響應(yīng)重寫的實(shí)現(xiàn),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-11-11
  • Java線程調(diào)度之線程休眠用法分析

    Java線程調(diào)度之線程休眠用法分析

    這篇文章主要介紹了Java線程調(diào)度之線程休眠用法,較為詳細(xì)的分析了Java線程休眠的功能與實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2015-06-06
  • Springsecurity Oauth2如何設(shè)置token的過(guò)期時(shí)間

    Springsecurity Oauth2如何設(shè)置token的過(guò)期時(shí)間

    如果用戶在指定的時(shí)間內(nèi)有操作就給token延長(zhǎng)有限期,否則到期后自動(dòng)過(guò)期,如何設(shè)置token的過(guò)期時(shí)間,本文就來(lái)詳細(xì)的介紹一下
    2021-08-08
  • Java中Optional的使用指南

    Java中Optional的使用指南

    這篇文章主要給大家介紹了關(guān)于Java中Optional使用的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • Effective Java 在工作中的應(yīng)用總結(jié)

    Effective Java 在工作中的應(yīng)用總結(jié)

    《Effective Java》是一本經(jīng)典的 Java 學(xué)習(xí)寶典,值得每位 Java 開(kāi)發(fā)者閱讀。下面文章即是將書(shū)中和平日工作較密切的知識(shí)點(diǎn)做了部分總結(jié),需要的朋友可以參考下
    2021-09-09
  • Java多線程之同步工具類CountDownLatch

    Java多線程之同步工具類CountDownLatch

    這篇文章主要介紹了Java多線程之同步工具類CountDownLatch,CountDownLatch是一個(gè)同步工具類,它允許一個(gè)或多個(gè)線程一直等待,直到其他線程執(zhí)行完后再執(zhí)行。例如,應(yīng)用程序的主線程希望在負(fù)責(zé)啟動(dòng)框架服務(wù)的線程已經(jīng)啟動(dòng)所有框架服務(wù)之后執(zhí)行,下面一起來(lái)學(xué)習(xí)學(xué)習(xí)內(nèi)容吧
    2021-10-10
  • Java Lambda List轉(zhuǎn)Map代碼實(shí)例

    Java Lambda List轉(zhuǎn)Map代碼實(shí)例

    這篇文章主要介紹了Java Lambda List轉(zhuǎn)Map代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • 如何使用BufferedReader循環(huán)讀文件

    如何使用BufferedReader循環(huán)讀文件

    這篇文章主要介紹了如何使用BufferedReader循環(huán)讀文件的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07

最新評(píng)論