概述
關於 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);
}
靜態方法調用的注意事項:
- 靜態方法可以直接訪問類變量和靜態方法。
- 靜態方法不能直接訪問普通成員變量或成員方法。反之,成員方法可以直接訪問類變量或靜態方法。
原因:因爲在內存當中是【先】有的靜態內容,【後】有的非靜態內容。
“先人不知道後人,但是後人知道先人。” - 靜態方法中,不能使用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教育品牌——黑馬程序員。