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