一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

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

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

服務器之家 - 編程語言 - Java教程 - 詳解Java中的實例初始化塊(IIB)

詳解Java中的實例初始化塊(IIB)

2021-06-04 14:01Java教程網 Java教程

在本篇文章里我們針對Java中的實例初始化塊(IIB)做想詳細分析,有需要的朋友們可以跟著學習參考下。

在 java 語言中的類初始化塊 文章中我們簡單的介紹了下 java 中的實例初始化塊 ( iib )。不過我覺得介紹的有點簡單了,于是,再寫一篇文章詳細介紹下吧。

java 語言中,存在三種操作:方法 、構造函數 和 初始化塊。

其中初始化塊又分為 實例初始化塊 ( iib ) 和 靜態初始化塊。本章節,我們主要介紹實例初始化塊。

實例初始化塊 用于初始化實例變量。

實例初始化塊 會在初始化類的一個實例時執行,而且在構造函數之前就執行。并且每次創建類的對象時它們都會執行。

實例化塊的語法

實例初始化塊一般放在構造函數之前,使用大括號 {} 擴起來的代碼。語法結構一般如下

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class javatester
{
  // 實例化塊
  {
    system.out.println("iib block");
  }
   
  // 構造函數
  javatester()
  {
    system.out.println("constructor called");
  }
  public static void main(string[] args)
  {
    javatester a = new javatester();
  }
}

注意,實例化塊并不是類的必須。只是一個可選項。用于抽出構造函數的公共部分單獨執行而已。

這段代碼是可以編譯運行的,運行結果如下

?
1
2
3
[yufei@www.twle.cn java]$ javac javatester.java && java javatester
iib block
constructor called

一個類中包含多個實例初始化塊

類中的 實例初始化塊 并不是類所必須的,而且,不限數量。一個類既可以沒有實例初始化塊,也可以有多個實例初始化塊。

如果一個類有多個實例初始化塊,那么它們會按照順序從上到下依次執行,也就是說,定義在類頂部的實例初始化塊最先執行。

我們來看一段代碼,下面的類 javatester 定義了多個實例初始化塊。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class javatester
{
  {
    system.out.println("iib1 block 1 ");
  }
   
  {
    system.out.println("iib2 block 2");
  }
    
  javatester()
  {
    system.out.println("constructor called");
  }
    
  {
    system.out.println("iib3 block 3");
  }
   
  public static void main(string[] args)
  {
    javatester a = new javatester();
  }
}

運行上面這段代碼,輸出結果如下

?
1
2
3
4
5
[yufei@www.twle.cn java]$ javac javatester.java && java javatester
iib1 block 1
iib2 block 2
iib3 block 3
constructor called

父類中的初始化塊

在 java 語言的繼承體系中,父類同樣可以有初始化塊,而且數量不限。

父類的實例初始化塊在子類的構造函數中調用 super() 之后立即運行。編譯器會在執行當前類的實例初始化塊之前先執行父類的實例初始化塊。

是不是很繞口,我們寫一段代碼來演示下

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
class b
{
  b()
  {
    system.out.println("b-constructor called");
  }
  
  {
    system.out.println("b-iib block");
  }
  
}
 
public class javatester extends b
{
  {
    system.out.println("javatester iib1 block 1 ");
  }
   
  {
    system.out.println("javatester iib2 block 2");
  }
    
  javatester()
  {
    super();
    system.out.println("javatester-constructor called");
  }
    
  {
    system.out.println("javatester iib3 block 3");
  }
   
  public static void main(string[] args)
  {
    javatester a = new javatester();
  }
}

運行以上范例,輸出結果如下

?
1
2
3
4
5
6
7
[yufei@www.twle.cn java]$ javac javatester.java && java javatester
b-iib block
b-constructor called
javatester iib1 block 1
javatester iib2 block 2
javatester iib3 block 3
javatester-constructor called

從運行的結果來看,當創建類 javatester 的對象時,編譯器嘗試執行類 javatester 的構造函數。但因為它有一個父類,在發現了 super() 語句后,就轉而先執行父類的構造函數。

因此,在繼承體系中,實例初始化塊和構造函數的執行順序如下

執行父類的實例初始化塊

執行父類的構造函數

執行當前類的實例初始化塊

執行當前類的構造函數

實例初始化塊的要點

我們一起來回顧下實例初始化塊的要點。

每次創建新實例時都會運行實例初始化塊

初始化塊按它們在類中出現的順序運行

如果存在父類,則首先會實例化父類然后在調用當前類的實例初始化塊,最后再調用當前類的構造函數。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 2022国产麻豆剧传媒剧情 | 欧美又大又粗又长又硬 | 欧美日韩亚洲综合久久久 | 日韩性大片免费 | 国产卡一卡二卡四卡无卡 | 欧美又硬又粗又长又大 | 日韩毛片免费在线观看 | 99热久久这里只有精品23 | 黑帮大佬与我的365天2标清中文 | 色久天 | 亚洲成在人线久久综合 | 国产一区二区在线观看视频 | www射com | 五月天国产精品 | www视频免费看 | 亚洲精品国产成人中文 | 亚洲精品二三区伊人久久 | 国产亚洲精品美女2020久久 | 深夜在线小视频 | 91制片厂免费观看 | 日韩欧美高清视频 | 国产99视频精品免视看9 | 美女口述又粗又大感觉 | 亚洲第一区在线观看 | 亚洲激情在线视频 | 国产一区二区精品久久91 | 久久久乱码精品亚洲日韩 | 国产香蕉一区二区在线观看 | 69短视频| 图片亚洲va欧美va国产综合 | 亚洲 欧美 在线观看 | 好大好硬好深好爽想要之黄蓉 | 国产在线欧美日韩精品一区二区 | 欧美专区在线视频 | 小女生RAPPER入口 | 欧美艳星kagneyiynn | 亚洲欧美色综合图小说 | 激情综合站 | 人人爽人人看 | 免费在线观看中文字幕 | 校花被强迫np肉高h 校服下的白嫩小乳尖h1v1 |