最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳談jvm--Java中init和clinit的區(qū)別

 更新時間:2017年10月09日 10:03:54   作者:HankingHu  
下面小編就為大家?guī)硪黄斦刯vm--Java中init和clinit的區(qū)別。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

init和clinit區(qū)別

①init和clinit方法執(zhí)行時機不同

init是對象構造器方法,也就是說在程序執(zhí)行 new 一個對象調用該對象類的 constructor 方法時才會執(zhí)行init方法,而clinit是類構造器方法,也就是在jvm進行類加載—–驗證—-解析—–初始化,中的初始化階段jvm會調用clinit方法。

②init和clinit方法執(zhí)行目的不同

init is the (or one of the) constructor(s) for the instance, and non-static field initialization.
clinit are the static initialization blocks for the class, and static field initialization.

上面這兩句是Stack Overflow上的解析,很清楚init是instance實例構造器,對非靜態(tài)變量解析初始化,而clinit是class類構造器對靜態(tài)變量,靜態(tài)代碼塊進行初始化??纯聪旅娴倪@段程序就很清楚了。

class X {
  static Log log = LogFactory.getLog(); // <clinit>
  private int x = 1;  // <init>
  X(){
   // <init>
  }
  static {
   // <clinit>
  }
}

clinit詳解

在準備階段,變量已經賦過一次系統(tǒng)要求的初始值,而在初始化階段,則根據程序員通過程序制定的主觀計劃去初始化類變量和其他資源,或者可以從另外一個角度來表達:初始化階段是執(zhí)行類構造器<clinit>()方法的過程。

①<clinit>()方法是由編譯器自動收集類中的所有類變量的賦值動作和靜態(tài)語句塊(static{}塊)中的語句合并產生的,編譯器收集的順序是由語句在源文件中出現的順序所決定的,靜態(tài)語句塊中只能訪問到定義在靜態(tài)語句塊之前的變量,定義在它之后的變量,在前面的靜態(tài)語句塊可以賦值,但是不能訪問如下代碼

public class Test{
static{
i=0;//給變量賦值可以正常編譯通過
System.out.print(i);//這句編譯器會提示"非法向前引用"
}
static int i=1;
}

②虛擬機會保證在子類的<clinit>()方法執(zhí)行之前,父類的<clinit>()方法已經執(zhí)行完畢。 因此在虛擬機中第一個被執(zhí)行的<clinit>()方法的類肯定是java.lang.Object。由于父類的<clinit>()方法先執(zhí)行,也就意味著父類中定義的靜態(tài)語句塊要優(yōu)先于子類的變量賦值操作,如下代碼中,字段B的值將會是2而不是1。

static class Parent{
  public static int A=1;
  static{
  A=2;}
  static class Sub extends Parent{
  public static int B=A;
  }
  public static void main(String[]args){
  System.out.println(Sub.B);
  }
}

③接口中不能使用靜態(tài)語句塊,但仍然有變量初始化的賦值操作,因此接口與類一樣都會生成<clinit>()方法。 但接口與類不同的是,執(zhí)行接口的<clinit>()方法不需要先執(zhí)行父接口的<clinit>()方法。 只有當父接口中定義的變量使用時,父接口才會初始化。 另外,接口的實現類在初始化時也一樣不會執(zhí)行接口的<clinit>()方法。

注意:接口中的屬性都是static final類型的常量,因此在準備階段就已經初始化話。

以上這篇詳談jvm--Java中init和clinit的區(qū)別就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

您可能感興趣的文章:

相關文章

  • Java monitor機制使用方法解析

    Java monitor機制使用方法解析

    這篇文章主要介紹了Java monitor機制使用方法解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-09-09
  • Java數據類型轉換詳解

    Java數據類型轉換詳解

    這篇文章主要講解Java中基本數據類型、字符串與其它數據類型以及常見的日期類型的轉換,希望能給大家做一個參考。
    2016-06-06
  • springboot加載命令行參數ApplicationArguments的實現

    springboot加載命令行參數ApplicationArguments的實現

    本文主要介紹了springboot加載命令行參數ApplicationArguments的實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-04-04
  • java可變參數使用示例

    java可變參數使用示例

    這篇文章主要介紹了java可變參數使用示例,需要的朋友可以參考下
    2014-04-04
  • 使用java實現猜拳小游戲

    使用java實現猜拳小游戲

    這篇文章主要為大家詳細介紹了使用java實現猜拳小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • SpringBoot整合Javamail實現郵件發(fā)送的詳細過程

    SpringBoot整合Javamail實現郵件發(fā)送的詳細過程

    日常開發(fā)過程中,我們經常需要使用到郵件發(fā)送任務,比方說驗證碼的發(fā)送、日常信息的通知等,下面這篇文章主要給大家介紹了關于SpringBoot整合Javamail實現郵件發(fā)送的詳細過程,需要的朋友可以參考下
    2022-10-10
  • Mybatis游標查詢大量數據方式

    Mybatis游標查詢大量數據方式

    這篇文章主要介紹了Mybatis游標查詢大量數據方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • java面向對象設計原則之接口隔離原則示例詳解

    java面向對象設計原則之接口隔離原則示例詳解

    這篇文章主要為大家介紹了java面向對象設計原則之接口隔離原則的示例詳解,有需要的朋友可以借鑒參考下希望能夠有所幫助,祝大家多多進步早日升職加薪
    2021-10-10
  • Java使用GUI繪制線條的示例

    Java使用GUI繪制線條的示例

    這篇文章主要介紹了Java使用GUI繪制線條的示例,幫助大家更好的理解和學習java gui編程,感興趣的朋友可以了解下
    2020-09-09
  • mybatis-plus?Wrapper條件構造器updateForSet更新方式

    mybatis-plus?Wrapper條件構造器updateForSet更新方式

    這篇文章主要介紹了mybatis-plus?Wrapper條件構造器updateForSet更新方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03

最新評論

昌邑市| 保靖县| 巴塘县| 曲麻莱县| 金华市| 望江县| 吉安县| 固镇县| 和政县| 葫芦岛市| 五大连池市| 南昌县| 扬州市| 花莲市| 万山特区| 新宁县| 舒城县| 阿图什市| 育儿| 柳江县| 兴宁市| 濮阳县| 湖口县| 汉中市| 颍上县| 孝义市| 辛集市| 辽源市| 图片| 孟村| 施秉县| 延庆县| 辽源市| 泰顺县| 商南县| 涞水县| 酉阳| 黑山县| 会昌县| 巨鹿县| 商丘市|