這一節我們看一個比較特殊的概念,那就是靜態代碼塊。
前面我們也提到過代碼塊,就是一段獨立的代碼空間,那么什么是靜態代碼塊呢?說白了,**就是用static關鍵字修飾的代碼塊。**
我們來看一個例子:
~~~
class StaticBlock
{
static
{
System.out.println("靜態代碼塊被執行");
}
void myPrint()
{
System.out.println("myPrint方法執行");
}
}
class StaticBlockTest
{
public static void main(String[] args)
{
new StaticBlock().myPrint();
}
}
~~~
我們來看一看運行結果:

從結果我們看到了我們調用的myPrint函數被調用執行了,并且在此函數被調用之前,靜態代碼塊就已經被執行。
這就是我們要說的特別之處,靜態代碼塊是特殊的代碼塊,它被static關鍵字修飾,并且擁有靜態的所有特征,最主要的是它有一個比較自然獨特的特點:我們之前說,**靜態隨著類的加載而加載,而靜態代碼塊隨著著類的加載而執行,只要類被加載,那么該靜態代碼塊就會被執行,并且只執行一次。**
我們看下面的測試:
~~~
class StaticBlockTest
{
public static void main(String[] args)
{
new StaticBlock().myPrint();
new StaticBlock().myPrint();
}
}
~~~
結果:

我們看到,靜態代碼塊只執行了一次,而我們的myPrint方法被調用了兩次執行了兩次。所以當類加載時,靜態方法就已經加載并且執行一次。
通過上面的例子讓我們明確了靜態代碼塊的實際作用:**用于給類進行初始化。**
這就相當于我們之前學習的構造函數,構造函數是用于給對象進行初始化,而靜態代碼塊是用來給類進行初始化。
這里我們也許會有疑問,既然構造函數能夠進行初始化,那么我們為什么還要用靜態代碼塊來初始化呢,其實不是所有的類都能創建對象,因為有些類有可能不需要被創建對象的,比如我們在一個類中定義的全部是靜態成員,那么創建對象就沒有意義。
我們再看一個靜態代碼塊的用法,我們看下面的代碼:
~~~
class StaticBlock
{
static int num;
static
{
num = 10;
num = num * 3;
}
void myPrint()
{
System.out.println("num = "+num);
}
}
class StaticBlockTest
{
public static void main(String[] args)
{
new StaticBlock().myPrint();
}
}
~~~
我們來看運行結果:

從結果我們直接可以看到,我們在靜態代碼塊中對靜態變量進行了多次運算和賦值,所以當我們需要對靜態變量進行多次運算時我們可以運用靜態代碼塊。
不過這個在開發中用的并不多,在一些底層的框架開發中會專門用到。
這一節我們就簡單的學到這里。
- 前言
- 1.1 基本常識
- 1.2 Java語言概述
- 1.3 Java語言的環境搭建
- 1.4 Java程序開發之初體驗--Hello World
- 2.1 關鍵字
- 2.2 標識符
- 2.3 注釋
- 2.4 常量
- 2.5 進制掃盲
- 2.6 變量和數據類型(1)
- 2.7 變量和數據類型(2)
- 2.8 運算符
- 3.1 if語句
- 3.2 switch語句
- 3.3 while和do-while語句
- 3.4 for語句
- 3.5 for循環的嵌套
- 3.6 break語句與continue語句
- 4.1 函數的定義
- 4.2 定義函數的兩個明確
- 4.3 函數的內存加載過程
- 4.4 函數的重載
- 5.1 數組的定義
- 5.2 數組的內存分配及特點
- 5.3 數組操作中常見問題
- 5.4 數組常用操作(1)
- 5.5 數組常用操作(2)
- 5.6 二維數組
- 6.1 面向對象的概述
- 6.2 類與對象的關系
- 6.3 對象的內存體現
- 6.4 成員變量與局部變量
- 6.5 類類型參數與匿名對象
- 6.6 基本數據類型參數與引用數據類型參數的傳遞過程
- 6.7 封裝
- 7.1 構造函數概述與默認構造函數
- 7.2 構造函數與一般函數的區別
- 7.3 構造函數的重載
- 7.4 構造函數的內存加載
- 7.5 構造函數需要注意的幾個細節
- 7.6 this關鍵字的原理
- 7.7 this關鍵字的細節與應用
- 8.1 static關鍵字之特點
- 8.2 成員變量與靜態變量的區別
- 8.3 static關鍵字使用的注意細節
- 8.4 main函數的解析與細節
- 8.5 static關鍵字的使用場景
- 8.6 靜態的內存加載
- 8.7 靜態代碼塊
- 8.8 構造代碼塊
- 9.1 繼承
- 9.2 單繼承與多重繼承
- 9.3 子父類中成員變量特征體現