Java static關鍵字

概述

關於 static 關鍵字的使用,它可以用來修飾的成員變量和成員方法,被修飾的成員是屬於類的,而不是單單是屬於某個對象的。也就是說,既然屬於類,就可以不靠創建對象來調用了。

定義和使用格式

2.1 類變量

static 修飾成員變量時,該變量稱爲類變量。該類的每個對象都共享同一個類變量的值。任何對象都可以更改該類變量的值,但也可以在不創建該類的對象的情況下對類變量進行操作。

  • 類變量:使用 static關鍵字修飾的成員變量。

定義格式:

static 數據類型 變量名;

舉例:

static int numberID;

比如說,基礎班新班開班,學員報到。現在想爲每一位新來報到的同學編學號(sid),從第一名同學開始,sid爲1,以此類推。學號必須是唯一的,連續的,並且與班級的人數相符,這樣以便知道,要分配給下一名新同學的學號是多少。這樣我們就需要一個變量,與單獨的每一個學生對象無關,而是與整個班級同學數量有關。

所以,我們可以這樣定義一個靜態變量numberOfStudent,代碼如下:

public class Student {
	private String name;
	private int age;
	// 學生的id
	private int sid;
	// 類變量,記錄學生數量,分配學號
	public static int numberOfStudent = 0;
	
	public Student(String name, int age){
		this.name = name;
		this.age = age;
		// 通過 numberOfStudent 給學生分配學號
		this.sid = ++numberOfStudent;
	}
	
	// 打印屬性值
	public void show() {
		System.out.println("Student : name=" + name + ", age=" + age + ", sid=" + sid );
	}
}
public class StuDemo {
	public static void main(String[] args) {
		Student s1 = new Student("張三", 23);
		Student s2 = new Student("李四", 24);
		Student s3 = new Student("王五", 25);
		Student s4 = new Student("趙六", 26);
		s1.show(); // Student : name=張三, age=23, sid=1
		s2.show(); // Student : name=李四, age=24, sid=2
		s3.show(); // Student : name=王五, age=25, sid=3
		s4.show(); // Student : name=趙六, age=26, sid=4
	}
}

2.2 靜態方法

static 修飾成員方法時,該方法稱爲類方法 。靜態方法在聲明中有 static ,建議使用類名來調用,而不需要創建類的對象。調用方式非常簡單。

  • 類方法:使用 static關鍵字修飾的成員方法,習慣稱爲靜態方法

定義格式:

修飾符 static 返回值類型 方法名 (參數列表){
	// 執行語句
}

舉例:在Student類中定義靜態方法

public static void showNum() {
	System.out.println("num:" + numberOfStudent);
}

靜態方法調用的注意事項

  1. 靜態方法可以直接訪問類變量和靜態方法。
  2. 靜態方法不能直接訪問普通成員變量或成員方法。反之,成員方法可以直接訪問類變量或靜態方法。
    原因:因爲在內存當中是【先】有的靜態內容,【後】有的非靜態內容。
    “先人不知道後人,但是後人知道先人。”
  3. 靜態方法中,不能使用this關鍵字。

小貼士:靜態方法只能訪問靜態成員。

2.3 調用格式

被static修飾的成員可以並且建議通過類名直接訪問。雖然也可以通過對象名訪問靜態成員,原因即多個對象均屬於一個類,共享使用同一個靜態成員,但是不建議,會出現警告信息。

格式:

// 訪問類變量
類名.類變量名;
// 調用靜態方法
類名.靜態方法名(參數);

調用演示,代碼如下:

public class StuDemo2 {
	public static void main(String[] args) {
		// 訪問類變量
		System.out.println(Student.numberOfStudent);
		// 調用靜態方法
		Student.showNum();
	}
}

小貼士:對象.靜態方法名(參數)這種寫法在編譯之後也會被 javac 翻譯成爲類名.靜態方法名(參數)

靜態原理圖解

static 修飾的內容:

  • 是隨着類的加載而加載的,且只加載一次。
  • 存儲於一塊固定的內存區域(靜態區),所以,可以直接被類名調用。
  • 它優先於對象存在,所以,可以被所有對象共享。

在這裏插入圖片描述

靜態代碼塊

靜態代碼塊:定義在成員位置,使用static修飾的代碼塊{ }。

  • 位置:類中方法外。
  • 執行:隨着類的加載而執行且執行一次,優先於main方法和構造方法的執行。

格式:

public class ClassName{
	static {
		// 執行語句
	}
}

作用:給類變量進行初始化賦值。用法演示,代碼如下:

public class Game {
	public static int number;
	public static ArrayList<String> list;
	static {
		// 給類變量賦值
		number = 2;
		list = new ArrayList<String>();
		// 添加元素到集合中
		list.add("張三");
		list.add("李四");
	}
}

小貼士:靜態內容總是優先於非靜態,所以靜態代碼塊比構造方法先執行。

我是知識的搬運工,該篇文章內容藉助於高端IT教育品牌——黑馬程序員。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章