Java 中的 static 使用之靜態變數·靜態方法·靜態初始化塊
Java 中的 static 使用之靜態變數
大家都知道,我們可以基於一個類建立多個該類的物件,每個物件都擁有自己的成員,互相獨立。然而在某些時候,我們更希望該類所有的物件共享同一個成員。此時就是 static 大顯身手的時候了!!
Java 中被 static 修飾的成員稱為靜態成員或類成員。它屬於整個類所有,而不是某個物件所有,即被類的所有物件所共享。靜態成員可以使用類名直接訪問,也可以使用物件名進行訪問。當然,鑑於他作用的特殊性更推薦用類名訪問~~
使用 static 可以修飾變數、方法和程式碼塊。
本小節,我們先認識一下靜態變數。
例如,我們在類中定義了一個 靜態變數 hobby ,操作程式碼如下所示:
要注意哦:靜態成員屬於整個類,當系統第一次使用該類時,就會為其分配記憶體空間直到該類被解除安裝才會進行資源回收!~~
任務
在編輯器中定義了一個 HelloWorld 類,在類中定義一個靜態變數 className ,儲存班級名稱。在 main 方法中呼叫靜態變數輸出班級資訊。
請將第 4、9 行中程式碼補充完整
執行結果: JAVA開發一班
public class HelloWorld { // 定義靜態變數,儲存班級名稱 static String className = "JAVA開發一班"; public static void main(String[] args) { // 訪問靜態變數,輸出班級名稱 System.out.println(HelloWorld.className ); } }
Java 中的 static 使用之靜態方法
與靜態變數一樣,我們也可以使用 static 修飾方法,稱為靜態方法或類方法。其實之前我們一直寫的 main 方法就是靜態方法。靜態方法的使用如:
需要注意:
1、 靜態方法中可以直接呼叫同類中的靜態成員,但不能直接呼叫非靜態成員。如:
如果希望在靜態方法中呼叫非靜態變數,可以通過建立類的物件,然後通過物件來訪問非靜態變數。如:
2、 在普通成員方法中,則可以直接訪問同類的非靜態變數和靜態變數,如下所示:
3、 靜態方法中不能直接呼叫非靜態方法,需要通過物件來訪問非靜態方法。如:
任務
在編輯器中分別定義了兩個靜態變數 score1 和 score2 ,用於儲存成績資訊。定義了一個靜態方法 sum ,用於計算成績總分,在 main 方法中通過呼叫靜態方法輸出成績總分
請根據註釋,將第 6、9、10、18 行程式碼補充完整
執行結果: 總分:178
</pre><pre name="code" class="java">
public class HelloWorld {
// 定義靜態變數score1
static int score1 = 86;
// 定義靜態變數score2
static int score2 = 92;
// 定義靜態方法sum,計算成績總分,並返回總分
public static int sum() {
return score1+score2;
}
public static void main(String[] args) {
// 呼叫靜態方法sum並接收返回值
int allScore = sum();
System.out.println("總分:" + allScore);
}
}
Java 中的 static 使用之靜態初始化塊
Java 中可以通過初始化塊進行資料賦值。如:
在類的宣告中,可以包含多個初始化塊,當建立類的例項時,就會依次執行這些程式碼塊。如果使用 static 修飾初始化塊,就稱為靜態初始化塊。
需要特別注意:靜態初始化塊只在類載入時執行,且只會執行一次,同時靜態初始化塊只能給靜態變數賦值,不能初始化普通的成員變數。
我們來看一段程式碼:
執行結果:
通過輸出結果,我們可以看到,程式執行時靜態初始化塊最先被執行,然後執行普通初始化塊,最後才執行構造方法。由於靜態初始化塊只在類載入時執行一次,所以當再次建立物件 hello2 時並未執行靜態初始化塊。
任務
小夥伴們,做個練習加深對靜態初始化塊的理解吧!
在編輯器中,分別通過構造方法、初始化塊和靜態初始化塊對變數進行初始化賦值。
將第 8、20、34 行中程式碼補充完整
public class HelloWorld {
String name; // 宣告變數name
String sex; // 宣告變數sex
static int age;// 宣告靜態變數age
// 構造方法
public HelloWorld () {
System.out.println("通過構造方法初始化name");
name = "tom";
}
// 初始化塊
{
System.out.println("通過初始化塊初始化sex");
sex = "男";
}
// 靜態初始化塊
static {
System.out.println("通過靜態初始化塊初始化age");
age = 20;
}
public void show() {
System.out.println("姓名:" + name + ",性別:" + sex + ",年齡:" + age);
}
public static void main(String[] args) {
// 建立物件
HelloWorld hello = new HelloWorld();
// 呼叫物件的show方法
hello.show();
}
}