1,Java 中被 static 修飾的成員稱為靜態成員或類成員。它屬于整個類所有,而不是某個對象所有,即被類的所有對象所共享。靜態成員可以使用類名直接訪問,也可以使用對象名進行訪問。當然,鑒于他作用的特殊性更推薦用類名訪問~~
注:
- 靜態成員屬于整個類,當系統第一次使用該類時,就會為其分配內存空間直到該類被卸載才會進行資源回收!
- 靜態方法中可以直接調用同類中的靜態成員,但不能直接調用非靜態成員(可以通過對象來實現在靜態方法中調用非靜態變量)
//普通方法
public void normalMedthod(){
System.out.println("普通方法!");
}
//靜態方法
public static void staticMedthod(){
System.out.println("靜態方法!");
}
public static void main(String[] args){
//普通方法,必須創建對象調用
Person person=new Person();
person.normalMedthod();
//可以直接調用靜態方法
staticMedthod();
}
- 靜態初始化塊:只在類加載時執行,且只會執行一次,同時靜態初始化塊只能給靜態變量賦值,不能初始化普通的成員變量。
2,內部類
-
靜態內部類(不持有外部類引用)
靜態內部類不能直接訪問外部類的非靜態成員,但可以通過 new 外部類().成員 的方式訪問
如果外部類的靜態成員與內部類的成員名稱相同,可通過“類名.靜態成員”訪問外部類的靜態成員;如果外部類的靜態成員與內部類的成員名稱不相同,則可通過“成員名”直接調用外部類的靜態成員
創建靜態內部類的對象時,不需要外部類的對象,可以直接創建 內部類 對象名= new 內部類();
-
普通內部類(隱式持有外部類對象,有時候會造成內存泄漏)
- 普通內部類,可以直接訪問外部類中的數據,不受訪問控制符影響。
- 定義了普通內部類后,必須使用外部類對象來創建內部類對象,而不能直接去 new 一個內部類對象,即:內部類 對象名 = 外部類對象.new 內部類( );
3,static 初始化相關
- 當要實例化一個類時,JVM會首先加載該類,并且在加載過程中檢查這個類是否有靜態屬性以及靜態代碼塊,如果有,就按順序分配內存并初始化他們,并且只在類加載的過程中初始化一次。
對于構造代碼塊,以及普通屬性,是在類實例化時進行的,并且每次實例化都會調用,并且構造代碼塊先于構造方法執行。