一.簡介
創(chuàng)新互聯(lián)是一家集網(wǎng)站建設,婁星企業(yè)網(wǎng)站建設,婁星品牌網(wǎng)站建設,網(wǎng)站定制,婁星網(wǎng)站建設報價,網(wǎng)絡營銷,網(wǎng)絡優(yōu)化,婁星網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學習、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。
首先說一下,Java中有哪些代碼塊.
普通代碼塊
就是在方法后面使用"{}"括起來的代碼片段,不能單獨執(zhí)行,必須調(diào)下其方法名才可以執(zhí)行.12
靜態(tài)代碼塊
在類中使用static修飾,并使用"{}"括起來的代碼片段,用于靜態(tài)變量的初始化或對象創(chuàng)建前的環(huán)境初始化.12
同步代碼塊
使用synchronize關鍵字修飾,并使用"{}"括起來的代碼片段.它表示在同一時間只能有一個線程進入到該方法快中,是一種多線程保護機制.12
構造代碼塊
在類中沒與任何的前綴或后綴,并使用"{}"括起來的代碼片段.12
簡單的例子:
public class Client {
{//構造代碼塊
System.out.println("執(zhí)行構造代碼塊");
} public Client() {
System.out.println("執(zhí)行無參構造函數(shù)");
} public Client(String string) {
System.out.println("執(zhí)行有參構造函數(shù)");
}
}12345678910111213
這是一丟按非常簡單的代碼,它包含了構造代碼塊,無參構造,有參構造.我先看一個問題,我們知道代碼塊不具有獨立執(zhí)行的能力,那么編譯器是如何處理構造代碼塊的呢?很簡單,編譯器會把構造代碼塊插入到每個構造函數(shù)的最前端.這樣 上面的代碼就等同于:
public class Client { public Client() {
System.out.println("執(zhí)行構造代碼塊");
System.out.println("執(zhí)行無參構造函數(shù)");
} public Client(String string) {
System.out.println("執(zhí)行構造代碼塊");
System.out.println("執(zhí)行有參構造函數(shù)");
}
}12345678910111213
二.特性與應用
基本的理解后,我們再來看下其和構造函數(shù)的執(zhí)行順序.由于是插入到構造函數(shù)的的前面,自然在通過new關鍵字生成一個實例的時候會先執(zhí)行構造代碼塊,然后在執(zhí)行其他代碼(注意:構造代碼塊不是在構造函數(shù)之前運行,而是依托于構造函數(shù)).接著我們來看一下兩個主要的應用場景:
1.初始化實例變量
如果每個構造函數(shù)都需要初始化變量,即可通過構造代碼塊來實現(xiàn).從而取代在每個構造函數(shù)調(diào)用初始化實例變量的方法.12
2.初始化實例環(huán)境
一個對象必須在適當?shù)膱鼍跋虏拍艽嬖?如果沒有適當?shù)膱鼍?則就需要在創(chuàng)建對象的時候創(chuàng)建此場景.12
以上兩個場景都是利用了構造代碼塊的兩個特性:
1.在每個構造函數(shù)中都運行
2.在構造函數(shù)中它會首先運行123
三.構造代碼塊足夠聰明
首先看一段代碼,使用構造代碼塊做對象計數(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
這個代碼真的達到我們預期的效果嗎?你可能會對this()產(chǎn)生了質疑.
答案是:3.
顯然Java編譯器是足夠聰明的.這是因為,在插入到每個構造函數(shù)中的時候,有個例外,就是如果遇到this關鍵字(也就是構造函數(shù)調(diào)用自身其他的構造函數(shù)時)不插入構造代碼塊.
那為什么編譯器這么聰明呢?這是因為構造代碼塊的出現(xiàn)就是為了提取構造函數(shù)的共同量,減少各個構造函數(shù)的代碼而產(chǎn)生的.
四.總結
靈活適當?shù)氖褂脴嬙齑a塊會讓你的代碼更加的簡約和清晰.代碼的質量自然很高很多,逼格也高了許多,有沒有.
最后還有一點需要注意的,千萬不要認為this是特殊情況,那super也會類似處理.其實不會,在構造代碼塊的處理上,super方法沒有任何特殊的地方.編譯器只是把構造代碼塊插入到super方法之后執(zhí)行而已.
java邏輯代碼塊是指使用{}大括號內(nèi)的代碼片段,為了實現(xiàn)某種邏輯和主類區(qū)分開來的一段代碼。分為靜態(tài)代碼塊、普通代碼塊,示例如下:
/**
*?靜態(tài)代碼塊先于構造器執(zhí)行?普通塊先于構造塊??只執(zhí)行一次
*?凡是靜態(tài)的與對象無關,先于對象存在的;?凡是靜態(tài)的都是共享的
*
*/
public?class?Test?{
static?{//靜態(tài)代碼塊
System.out.println("static");
}
{
System.out.println("普通塊2");
}
public?Test()?{
System.out.println("構造器");
}
中括號表示代碼塊,一般定義類,方法或者代碼塊都要用到花括號
比如
class A{定義類}
void print{定義方法}
static {
定義靜態(tài)代碼塊
}
一、普通代碼塊
直接在一個方法中出現(xiàn)的{}就稱為普通代碼塊,例子程序如下:
public class CodeDemo01{
public static void main(String[] args){
//普通代碼塊
{
int x = 10;
System.out.println("x=" + x);
}
int x = 100;
System.out.println("x=" + x);
}
}
二、構造代碼塊
直接在類中定義的沒有加static關鍵字的代碼塊{}稱為構造代碼塊,例子程序如下:
public class CodeDemo02{
public CodeDemo02(){
System.out.println("========這是構造方法=========");
}
//這是構造代碼塊,而且在new對象時,構造代碼塊優(yōu)先構造方法執(zhí)行
{
System.out.println("=========這是構造塊!=========");
}
public static void main(String[] args){
new CodeDemo02();
new CodeDemo02();
}
}
三、靜態(tài)代碼塊
使用static關鍵字聲明的代碼塊稱為靜態(tài)代碼塊,靜態(tài)塊的主要目的是用來為靜態(tài)屬性初始化,例子程序如下:
public class CodeDemo03
{
static{
System.out.println("這是主類中的靜態(tài)代碼塊!");
}
public static void main(String[] args){
new Demo();
new Demo();
new Demo();
}
}
class Demo
{
static{
System.out.println("這是Demo類中的靜態(tài)代碼塊!");
}
{
System.out.println("這是Demo類中的構造塊!");
}
public Demo(){
System.out.println("這是構造方法!");
}
}
靜態(tài)塊優(yōu)先于主方法的執(zhí)行,靜態(tài)塊優(yōu)先于構造方法的執(zhí)行,而且只執(zhí)行一次!
四、同步代碼塊
同步代碼塊主要出現(xiàn)在多線程中。
通常{}中間的代碼是一個代碼塊,可以用作方法體、循環(huán)體、判斷執(zhí)行語句塊等等,必須是成對出現(xiàn)的。類class的范圍也用大括號包裹。
第一對花括號是屬于構造方法的,第二對花括號括出了類的動態(tài)代碼塊,每次構造對象時都會執(zhí)行動態(tài)代碼塊。
另外動態(tài)代碼塊是在構造方法之前執(zhí)行的。