構(gòu)造代碼塊:是給所有的對象進(jìn)行初始化,也就是說,所有的對象都會調(diào)用一個代碼塊,只要對象一建立,就會調(diào)用這個代碼塊。
發(fā)展壯大離不開廣大客戶長期以來的信賴與支持,我們將始終秉承“誠信為本、服務(wù)至上”的服務(wù)理念,堅持“二合一”的優(yōu)良服務(wù)模式,真誠服務(wù)每家企業(yè),認(rèn)真做好每個細(xì)節(jié),不斷完善自我,成就企業(yè),實現(xiàn)共贏。行業(yè)涉及成都PE包裝袋等,在網(wǎng)站建設(shè)公司、營銷型網(wǎng)站、WAP手機網(wǎng)站、VI設(shè)計、軟件開發(fā)等項目上具有豐富的設(shè)計經(jīng)驗。
構(gòu)造函數(shù):是給與之對應(yīng)的對象進(jìn)行初始化,它具有針對性。
靜態(tài)初始化塊:當(dāng)類第一次加載時執(zhí)行。
非靜態(tài)初始化塊:非靜態(tài)初始化塊會在構(gòu)造函數(shù)執(zhí)行時,且在構(gòu)造函數(shù)主體代碼執(zhí)行之前被執(zhí)行。
區(qū)別如下:
1、執(zhí)行次數(shù)不同
靜態(tài)塊只執(zhí)行一次,初始化塊可以執(zhí)行多次。
2、作用不同
靜態(tài)初始化塊僅能初始化類變量,即static修飾的數(shù)據(jù)成員。
非靜態(tài)初始化塊可以初始化類的實例變量。
擴展資料:
使用Java靜態(tài)代碼塊注意事項:
1、它是隨著類的加載而執(zhí)行,只執(zhí)行一次,并優(yōu)先于主函數(shù)。具體說,靜態(tài)代碼塊是由類調(diào)用的。類調(diào)用時,先執(zhí)行靜態(tài)代碼塊,然后才執(zhí)行主函數(shù)的。
2、靜態(tài)代碼塊其實就是給類初始化的,而構(gòu)造代碼塊是給對象初始化的。
3、靜態(tài)代碼塊中的變量是局部變量,與普通函數(shù)中的局部變量性質(zhì)沒有區(qū)別。
4、一個類中可以有多個靜態(tài)代碼塊。
5、對于靜態(tài)變量、靜態(tài)初始化塊、變量、初始化塊、構(gòu)造器,它們的初始化順序依次是(靜態(tài)變量、靜態(tài)初始化塊)(變量、初始化塊)構(gòu)造器。
構(gòu)造函數(shù):執(zhí)行時間比構(gòu)造代碼塊時間晚,也是在對象初始化的時候運行。沒有返回值,構(gòu)造函數(shù)名稱和類名一致。
構(gòu)造代碼塊:執(zhí)行時間比靜態(tài)代碼塊晚,比構(gòu)造函數(shù)早,和構(gòu)造函數(shù)一樣,只在對象初始化的時候運行。沒有名字、參數(shù)和返回值。
靜態(tài)代碼塊:最早執(zhí)行,類被載入內(nèi)存時執(zhí)行,只執(zhí)行一次。沒有名字、參數(shù)和返回值,有關(guān)鍵字static。
靜態(tài)代碼塊只會在類被載入內(nèi)存時加載一次,是最先執(zhí)行的,然后是構(gòu)造代碼塊,最后才是構(gòu)造函數(shù)。構(gòu)造代碼塊和構(gòu)造函數(shù)都是在對象創(chuàng)建的時候執(zhí)行,有幾個對象就會執(zhí)行幾次。
一.簡介
首先說一下,Java中有哪些代碼塊.
普通代碼塊
就是在方法后面使用"{}"括起來的代碼片段,不能單獨執(zhí)行,必須調(diào)下其方法名才可以執(zhí)行.12
靜態(tài)代碼塊
在類中使用static修飾,并使用"{}"括起來的代碼片段,用于靜態(tài)變量的初始化或?qū)ο髣?chuàng)建前的環(huán)境初始化.12
同步代碼塊
使用synchronize關(guān)鍵字修飾,并使用"{}"括起來的代碼片段.它表示在同一時間只能有一個線程進(jìn)入到該方法快中,是一種多線程保護(hù)機制.12
構(gòu)造代碼塊
在類中沒與任何的前綴或后綴,并使用"{}"括起來的代碼片段.12
簡單的例子:
public class Client {
{//構(gòu)造代碼塊
System.out.println("執(zhí)行構(gòu)造代碼塊");
} public Client() {
System.out.println("執(zhí)行無參構(gòu)造函數(shù)");
} public Client(String string) {
System.out.println("執(zhí)行有參構(gòu)造函數(shù)");
}
}12345678910111213
這是一丟按非常簡單的代碼,它包含了構(gòu)造代碼塊,無參構(gòu)造,有參構(gòu)造.我先看一個問題,我們知道代碼塊不具有獨立執(zhí)行的能力,那么編譯器是如何處理構(gòu)造代碼塊的呢?很簡單,編譯器會把構(gòu)造代碼塊插入到每個構(gòu)造函數(shù)的最前端.這樣 上面的代碼就等同于:
public class Client { public Client() {
System.out.println("執(zhí)行構(gòu)造代碼塊");
System.out.println("執(zhí)行無參構(gòu)造函數(shù)");
} public Client(String string) {
System.out.println("執(zhí)行構(gòu)造代碼塊");
System.out.println("執(zhí)行有參構(gòu)造函數(shù)");
}
}12345678910111213
二.特性與應(yīng)用
基本的理解后,我們再來看下其和構(gòu)造函數(shù)的執(zhí)行順序.由于是插入到構(gòu)造函數(shù)的的前面,自然在通過new關(guān)鍵字生成一個實例的時候會先執(zhí)行構(gòu)造代碼塊,然后在執(zhí)行其他代碼(注意:構(gòu)造代碼塊不是在構(gòu)造函數(shù)之前運行,而是依托于構(gòu)造函數(shù)).接著我們來看一下兩個主要的應(yīng)用場景:
1.初始化實例變量
如果每個構(gòu)造函數(shù)都需要初始化變量,即可通過構(gòu)造代碼塊來實現(xiàn).從而取代在每個構(gòu)造函數(shù)調(diào)用初始化實例變量的方法.12
2.初始化實例環(huán)境
一個對象必須在適當(dāng)?shù)膱鼍跋虏拍艽嬖?如果沒有適當(dāng)?shù)膱鼍?則就需要在創(chuàng)建對象的時候創(chuàng)建此場景.12
以上兩個場景都是利用了構(gòu)造代碼塊的兩個特性:
1.在每個構(gòu)造函數(shù)中都運行
2.在構(gòu)造函數(shù)中它會首先運行123
三.構(gòu)造代碼塊足夠聰明
首先看一段代碼,使用構(gòu)造代碼塊做對象計數(shù)器.
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);
}
}123456789101112131415161718192021222324
這個代碼真的達(dá)到我們預(yù)期的效果嗎?你可能會對this()產(chǎn)生了質(zhì)疑.
答案是:3.
顯然Java編譯器是足夠聰明的.這是因為,在插入到每個構(gòu)造函數(shù)中的時候,有個例外,就是如果遇到this關(guān)鍵字(也就是構(gòu)造函數(shù)調(diào)用自身其他的構(gòu)造函數(shù)時)不插入構(gòu)造代碼塊.
那為什么編譯器這么聰明呢?這是因為構(gòu)造代碼塊的出現(xiàn)就是為了提取構(gòu)造函數(shù)的共同量,減少各個構(gòu)造函數(shù)的代碼而產(chǎn)生的.
四.總結(jié)
靈活適當(dāng)?shù)氖褂脴?gòu)造代碼塊會讓你的代碼更加的簡約和清晰.代碼的質(zhì)量自然很高很多,逼格也高了許多,有沒有.
最后還有一點需要注意的,千萬不要認(rèn)為this是特殊情況,那super也會類似處理.其實不會,在構(gòu)造代碼塊的處理上,super方法沒有任何特殊的地方.編譯器只是把構(gòu)造代碼塊插入到super方法之后執(zhí)行而已.
//構(gòu)造塊:直接在類中定義且沒有加static關(guān)鍵字的代碼塊稱為{}構(gòu)造代碼塊。構(gòu)造代碼塊在創(chuàng)建對象時被調(diào)用,每次創(chuàng)建對象都會被調(diào)用,并且構(gòu)造代碼塊的執(zhí)行次序優(yōu)先于類構(gòu)造函數(shù)。
public class CodeBlock02
{
{
System.out.println("第一代碼塊");
}
public CodeBlock02(){
System.out.println("構(gòu)造方法");
}
{
System.out.println("第二構(gòu)造塊");
}
public static void main(String[] args){
new CodeBlock02();
new CodeBlock02();
new CodeBlock02();
}
}
/**
執(zhí)行結(jié)果:
第一代碼塊
第二構(gòu)造塊
構(gòu)造方法
第一代碼塊
第二構(gòu)造塊
構(gòu)造方法
第一代碼塊
第二構(gòu)造塊
構(gòu)造方法*/
1. 局部代碼塊
作用在方法當(dāng)中,作用是控制變量的生命周期:
public void show(){
{
System.out.println("局部代碼塊運行!");
}
}123456
在程序中當(dāng)我們定義完成一個局部變量x之后,并且在接下來的代碼中,不想再用到它時,那么就沒必要讓x在內(nèi)存中繼續(xù)占用空間。因此就有了局部代碼塊。
2. 構(gòu)造代碼塊
作用在類的定義Body中,作用是給類的部分字段統(tǒng)一初始化:
public class Apple {
private String size;
//構(gòu)造代碼塊
{
System.out.println("構(gòu)造代碼塊運行!");
size = "E";
}
}
12345678910
構(gòu)造代碼塊與構(gòu)造函數(shù)的區(qū)別是:構(gòu)造代碼塊是給所有對象進(jìn)行統(tǒng)一初始化,而構(gòu)造函數(shù)是給對應(yīng)的對象初始化,因為構(gòu)造函數(shù)是可以多個的,運行哪個構(gòu)造函數(shù)就會建立什么樣的對象,但無論建立哪個對象,都會先執(zhí)行相同的構(gòu)造代碼塊。也就是說,構(gòu)造代碼塊中定義的是不同對象共性的初始化內(nèi)容。所以理所當(dāng)然的,構(gòu)造代碼塊在構(gòu)造函數(shù)之前執(zhí)行。
3. 靜態(tài)代碼塊
作用有兩個:
(1)給類的靜態(tài)變量賦值;
(2)聲明靜態(tài)變量;
作用在類的Body中,對類中的靜態(tài)變量初始化:
public class APP {
static int x, y; // 靜態(tài)變量
static {
x = 5; // 給靜態(tài)變量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
網(wǎng)站名稱:java怎么構(gòu)造代碼塊,java構(gòu)造方法代碼
標(biāo)題鏈接:http://chinadenli.net/article12/dsiigdc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供搜索引擎優(yōu)化、網(wǎng)站排名、域名注冊、關(guān)鍵詞優(yōu)化、網(wǎng)站營銷、云服務(wù)器
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)