激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - Java教程 - 詳談jvm--Java中init和clinit的區(qū)別

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

2021-01-15 14:10HankingHu Java教程

下面小編就為大家?guī)硪黄斦刯vm--Java中init和clinit的區(qū)別。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

init和clinit區(qū)別

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

init是對象構(gòu)造器方法,也就是說在程序執(zhí)行 new 一個對象調(diào)用該對象類的 constructor 方法時才會執(zhí)行init方法,而clinit是類構(gòu)造器方法,也就是在jvm進行類加載—–驗證—-解析—–初始化,中的初始化階段jvm會調(diào)用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實例構(gòu)造器,對非靜態(tài)變量解析初始化,而clinit是class類構(gòu)造器對靜態(tài)變量,靜態(tài)代碼塊進行初始化。看看下面的這段程序就很清楚了。

?
1
2
3
4
5
6
7
8
9
10
class X {
  static Log log = LogFactory.getLog(); // <clinit>
  private int x = 1;  // <init>
  X(){
   // <init>
  }
  static {
   // <clinit>
  }
}

clinit詳解

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

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

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

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

?
1
2
3
4
5
6
7
8
9
10
11
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>()方法。 只有當父接口中定義的變量使用時,父接口才會初始化。 另外,接口的實現(xiàn)類在初始化時也一樣不會執(zhí)行接口的<clinit>()方法。

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

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

原文鏈接:http://blog.csdn.net/u013309870/article/details/72975536

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25
主站蜘蛛池模板: 奶子吧naiziba.cc免费午夜片在线观看 | 福利在线国产 | 欧美a级毛片 | 久久精品首页 | 亚洲人成网在线观看 | 一级黄色淫片 | 72pao成人国产永久免费视频 | 色婷婷综合久久久中字幕精品久久 | 国内自拍网址 | 在线91视频| 国产99一区二区 | 中文字幕精品在线播放 | 久久色网站 | 亚洲午夜1000理论片aa | 又黄又爽又色无遮挡免费 | 亚洲国产精久久久久久久 | 欧美黄色免费视频 | 99国产精品欲a | 七首小情歌泰剧在线播放 | 毛片三区 | 久久国产精品网 | 最新毛片在线观看 | 手机国产乱子伦精品视频 | 成人偷拍片视频在线观看 | 国产一区免费视频 | 91精品国产一区二区在线观看 | 国产真实孩交 | 欧美不卡三区 | 免费观看又色又爽又黄的崩锅 | 性色av免费在线观看 | 久久激情小视频 | 久久中出| 中文字幕欧美视频 | 强伦女教师视频 | 亚洲一区二区免费 | 一二区电影 | 国产一国产一级毛片视频 | 黄污污网站 | 一色屋任你操 | 九九热在线视频免费观看 | ⅴideo裸体秀hd |