1. 程式人生 > >Java 中的 static 使用之靜態變數·靜態方法·靜態初始化塊

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();
        
	}
}