詳解Java 中 static 的作用
1.static 成員變量
- public class Student {
- // 靜態(tài)成員變量
- private static String SchoolName;
- private static int nums;
- // 非靜態(tài)成員變量
- private String name;
- private int age;
- }
在類中一個成員變量可用 static 關(guān)鍵字來修飾,這樣的成員變量稱為 static 成員變量,或靜態(tài)成員變量。而沒有用 static 關(guān)鍵字修飾的成員變量稱為非靜態(tài)成員變量。
靜態(tài)成員變量是屬于類的,也就是說,該成員變量并不屬于某個對象,即使有多個該類的對象實(shí)例,靜態(tài)成員變量也只有一個。只要靜態(tài)成員變量所在的類被加載,這個靜態(tài)成員變量就會被分配內(nèi)存空間。因此在引用該靜態(tài)成員變量時,通常不需要生成該類的對象,而是通過類名直接引用。引用的方法是“類名 . 靜態(tài)變量名”。當(dāng)然仍然可以通過“對象名 . 靜態(tài)變量名”的方式引用該靜態(tài)成員變量。相對應(yīng)的非靜態(tài)成員變量則屬于對象而非類,只有在內(nèi)存中構(gòu)建該類對象時,非靜態(tài)成員變量才被分配內(nèi)存空間。
2.static 成員方法
- public class Student {
- private static String SchoolName;
- private static int nums;
- // 靜態(tài)成員方法
- public static String getSchoolName() {
- return Student.SchoolName;
- }
- }
Java 中也支持用 static 關(guān)鍵字修飾的成員方法,即靜態(tài)成員方法。與此相對應(yīng)的沒有用 static 修飾的成員方法稱為非靜態(tài)成員方法。
與靜態(tài)成員變量類似,靜態(tài)成員方法是類方法,它屬于類本身而不屬于某個對象。因此靜態(tài)成員方法不需要創(chuàng)建對象就可以被調(diào)用,而非靜態(tài)成員方法則需要通過對象來調(diào)用。
特別需要注意的是,在靜態(tài)成員方法中不能使用 this、super 關(guān)鍵字,也不能調(diào)用非靜態(tài)成員方法,同時不能引用非靜態(tài)成員變量。這個道理是顯而易見的,因為靜態(tài)成員方法屬于類而不屬于某個對象,而 this、super 都是對象的引用,非靜態(tài)成員方法和成員變量也都屬于對象。所以當(dāng)某個靜態(tài)成員方法被調(diào)用時,該類的對象可能還沒有被創(chuàng)建,那么在靜態(tài)成員方法中調(diào)用對象屬性的方法或成員變量顯然是不合適的。即使該類的對象已經(jīng)被創(chuàng)建,也是無法確定它究竟是調(diào)用哪個對象的方法,或是哪個對象中的成員變量的。所以在這里特別強(qiáng)調(diào)這一點(diǎn)。
3.static 代碼塊
- public class Student {
- private static String SchoolName;
- private static int nums;
- // 靜態(tài)代碼塊
- static {
- Student.SchoolName = "清風(fēng)小學(xué)";
- Student.nums = 0;
- }
- }
static 代碼塊又稱為靜態(tài)代碼塊,或靜態(tài)初始化器。它是在類中獨(dú)立于成員函數(shù)的代碼塊。static 代碼塊不需要程序主動調(diào)用,在JVM加載類時系統(tǒng)會執(zhí)行 static 代碼塊,因此在static 代碼塊中可以做一些類成員變量的初始化工作。如果一個類中有多個 static 代碼塊,JVM將會按順序依次執(zhí)行。需要注意的是,所有的static 代碼塊只能在JVM加載類時被執(zhí)行一次。
4.static 內(nèi)部類
- public class Student {
- private static String SchoolName;
- private static int nums;
- // 靜態(tài)內(nèi)部類
- static class test{
- public test() {
- System.out.println("Hello,student!" );
- }
- }
- }
在 Java 中還支持用 static 修飾的內(nèi)部類,稱為靜態(tài)內(nèi)部類。靜態(tài)成員內(nèi)部類的特點(diǎn)主要是它本身是類相關(guān)的內(nèi)部類,所以它可以不依賴于外部類實(shí)例而被實(shí)例化。靜態(tài)內(nèi)部類不能訪問其外部類的實(shí)例成員(包括普通的成員變量和方法),只能訪問外部類的類成員(包括靜態(tài)成員變量和靜態(tài)方法)。即使是靜態(tài)內(nèi)部類的實(shí)例方法(非靜態(tài)成員方法)也不能訪問其外部類的實(shí)例成員。