導航:首頁 > 編程語言 > java類代碼塊

java類代碼塊

發布時間:2024-06-02 00:47:03

java構造代碼塊所在區域

一.簡介
首先說一下,Java中有哪些代碼塊.
普通代碼塊
就是在方法後面使用"{}"括起來的代碼片段,不能單獨執行,必須調下其方法名才可以執行.12

靜態代碼塊
在類中使用static修飾,並使用"{}"括起來的代碼片段,用於靜態變數的初始化或對象創建前的環境初始化.12

同步代碼塊
使用synchronize關鍵字修飾,並使用"{}"括起來的代碼片段.它表示在同一時間只能有一個線程進入到該方法快中,是一種多線程保護機制.12

構造代碼塊
在類中沒與任何的前綴或後綴,並使用"{}"括起來的代碼片段.12

簡單的例子:
public class Client {
{//構造代碼塊
System.out.println("執行構造代碼塊");
} public Client() {
System.out.println("執行無參構造函數");
} public Client(String string) {
System.out.println("執行有參構造函數");
}
}12345678910111213

這是一丟按非常簡單的代碼,它包含了構造代碼塊,無參構造,有參構造.我先看一個問題,我們知道代碼塊不具有獨立執行的能力,那麼編譯器是如何處理構造代碼塊的呢?很簡單,編譯器會把構造代碼塊插入到每個構造函數的最前端.這樣 上面的代碼就等同於:
public class Client { public Client() {
System.out.println("執行構造代碼塊");
System.out.println("執行無參構造函數");
} public Client(String string) {
System.out.println("執行構造代碼塊");
System.out.println("執行有參構造函數");
}
}12345678910111213

二.特性與應用
基本的理解後,我們再來看下其和構造函數的執行順序.由於是插入到構造函數的的前面,自然在通過new關鍵字生成一個實例的時候會先執行構造代碼塊,然後在執行其他代碼(注意:構造代碼塊不是在構造函數之前運行,而是依託於構造函數).接著我們來看一下兩個主要的應用場景:
1.初始化實例變數
如果每個構造函數都需要初始化變數,即可通過構造代碼塊來實現.從而取代在每個構造函數調用初始化實例變數的方法.12

2.初始化實例環境
一個對象必須在適當的場景下才能存在,如果沒有適當的場景,則就需要在創建對象的時候創建此場景.12

以上兩個場景都是利用了構造代碼塊的兩個特性:
1.在每個構造函數中都運行
2.在構造函數中它會首先運行123

三.構造代碼塊足夠聰明
首先看一段代碼,使用構造代碼塊做對象計數器.
public class Client { public static int count = 0;
{
count++;
} public Client() {

} public Client(int i) { this();
} public Client(String string) {
} public static void main(String[] args) { new Client(); new Client(1); new Client("1");
System.out.println(Client.count);
}
}

這個代碼真的達到我們預期的效果嗎?你可能會對this()產生了質疑.
答案是:3.
顯然Java編譯器是足夠聰明的.這是因為,在插入到每個構造函數中的時候,有個例外,就是如果遇到this關鍵字(也就是構造函數調用自身其他的構造函數時)不插入構造代碼塊.
那為什麼編譯器這么聰明呢?這是因為構造代碼塊的出現就是為了提取構造函數的共同量,減少各個構造函數的代碼而產生的.
四.總結
靈活適當的使用構造代碼塊會讓你的代碼更加的簡約和清晰.代碼的質量自然很高很多,逼格也高了許多,有沒有.
最後還有一點需要注意的,千萬不要認為this是特殊情況,那super也會類似處理.其實不會,在構造代碼塊的處理上,super方法沒有任何特殊的地方.編譯器只是把構造代碼塊插入到super方法之後執行而已.

Ⅱ java中靜態代碼塊 static的作用

類載入的時候就會去執行靜態代碼塊的內容。比如說:寫連接資料庫的那些內容時,經常有classforName("XXX"),用於載入一些東西,這些東西就可以寫在靜態代碼塊中。還有一些,你想讓類載入時就執行的程序也可以放在裡面。

Ⅲ Java常見代碼塊的作用與區別

1. 局部代碼塊
作用在方法當中,作用是控制變數的生命周期:
public void show(){
{
System.out.println("局部代碼塊運行!");
}
}123456

在程序中當我們定義完成一個局部變數x之後,並且在接下來的代碼中,不想再用到它時,那麼就沒必要讓x在內存中繼續佔用空間。因此就有了局部代碼塊。
2. 構造代碼塊
作用在類的定義Body中,作用是給類的部分欄位統一初始化:
public class Apple {
private String size;

//構造代碼塊
{
System.out.println("構造代碼塊運行!");
size = "E";
}
}
12345678910

構造代碼塊與構造函數的區別是:構造代碼塊是給所有對象進行統一初始化,而構造函數是給對應的對象初始化,因為構造函數是可以多個的,運行哪個構造函數就會建立什麼樣的對象,但無論建立哪個對象,都會先執行相同的構造代碼塊。也就是說,構造代碼塊中定義的是不同對象共性的初始化內容。所以理所當然的,構造代碼塊在構造函數之前執行。
3. 靜態代碼塊
作用有兩個:
(1)給類的靜態變數賦值;
(2)聲明靜態變數;
作用在類的Body中,對類中的靜態變數初始化:
public class APP {
static int x, y; // 靜態變數

static {
x = 5; // 給靜態變數x賦值
}

public static void myMethod() {
y = x++ + ++x; // x++ 先使用x的值再加1;++x先加1再使用x的值
}

public static void main(String[] args) {
x--;
myMethod();
System.out.println(x + y + ++x);
}
}

輸出:23

閱讀全文

與java類代碼塊相關的資料

熱點內容
esxi啟動虛擬機命令 瀏覽:967
軍工級單片機 瀏覽:109
伺服器安全保護是什麼意思 瀏覽:789
刪除運行命令 瀏覽:720
龍之召喚伺服器如何 瀏覽:119
linux目錄跳轉 瀏覽:368
程序員和老闆稱兄道弟 瀏覽:759
直播網路連接源碼 瀏覽:736
用安卓手機怎麼登錄蘋果手機id 瀏覽:710
論文查重工具源碼 瀏覽:401
android銀聯demo 瀏覽:86
智能演算法發展 瀏覽:351
房車露營地用什麼app 瀏覽:70
spark編程指南python 瀏覽:553
phparray源碼 瀏覽:1002
安卓手機反應有點慢怎麼辦 瀏覽:705
c語言怎麼訪問伺服器並獲取數據 瀏覽:114
怎麼下載三維app 瀏覽:77
把pdf中的圖片導出到excel 瀏覽:505
php操作redis實例 瀏覽:143