1.Static關鍵字的用途
1.1 Static修飾成員變量
1.1.1 Static修飾成員變量的需求
當我們在代碼中出現一個成員變量在我們每次創建不同的對象時,所賦值都一樣,我們就可以把它放在一個公共區域內,不管幾個對象都可以操作使用,而不在自己的對象保存數據,可以節約空間。
1.1.2 靜態成員變量使用注意事項
1. 靜態成員變量是使用static修飾的成員變量,定義在內存的數據區。
2. 靜態成員變量不推薦使用類對象調用,會提示警告,使用static修飾的類內的成員變量,應該通過靜態方式訪問。
3. 靜態成員變量使用類名調用是沒有任何的問題。強烈推薦方式。
4. 在代碼中沒有創建對象時,可以通過類名直接使用靜態成員變量,和對象無關。
5. 代碼中對象已經被JVM的GC銷燬時,依然可以通過類名調用靜態成員變量,和對象無關。
6. 不管通過哪一種方式調用靜態成員變量,修改對應的靜態成員變量數據,所有使用到當前靜態成員變量的位置,都會受到影響。
1.1.3 靜態成員變量和對象無關
1. 從內存角度出發分析
靜態成員變量是保存在內存的數據區
類對象佔用的實際內存空間是在內存的堆區
這兩個區域是完全不同的,所有可以說靜態成員變量和對象沒有關係 【沒有對象】
2. 從靜態成員變量以及類對象生命週期來分析
靜態成員變量是隨着類文件(.class) 字節碼文件的加載過程中,直接定義在內存的數據 區。靜態成員變量從程序運行開始就已經存在。
類對象是在代碼的運行過程中,有可能被創建的。程序的運行過中,有可能會被JVM的CG垃圾回收機制銷燬,程序在退出之前一定會銷燬掉當前Java程序使用到的所有內存。
靜態成員變量在程序退出之後,纔會銷燬
靜態成員變量的生命週期是從程序開始,到程序結束
類對象只是從創建開始,而且隨時有可能被JVM的GC銷燬
生命週期不在同一個時間線上,所以靜態成員變量和類對象無關,【沒有對象】
1.2 Static修飾成員方法
1.2.1 靜態成員方法注意事項
1. 靜態成員方法推薦使用靜態方式調用,通過類名調用 【強烈推薦】
不推薦使用類對象調用,因爲 【沒有對象】
2. 靜態成員方法中不能使用非靜態成員 ==> (非靜態成員方法和非靜態成員變量)
因爲 【沒有對象】
3. 靜態成員方法中不能使用this關鍵字
因爲 【沒有對象】
4. 靜態成員方法中可以使用類內的其他靜態成員 【難兄難弟】
5. 靜態成員方法中可以通過new 構造方法創建對象
單身狗可以找對象
不能挖牆腳但是能自己找
1.2.2 靜態成員方法特徵解釋
1. 靜態成員方法加載時間問題
靜態成員方法是隨着.class字節碼文件的加載而直接定義在內存的【方法區】,而且此時的靜態成員方法已經可以直接運行。可以通過類名直接調用,而此時沒有對象存在。 【沒有對象】
2. 爲什麼靜態成員方法不能使用非靜態成員
非靜態成員變量和非靜態成員方法時需要類對象調用的,在靜態成員方法中,是可以通過類名直接執行的,而此時是 【沒有對象】
3. 爲什麼靜態成員方法不能使用this關鍵字
this關鍵字表示的是調用當前方法的類對象,但是靜態成員方法可以通過類名調用,this不能代表類名,同時也是 【沒有對象】
4. 靜態成員方法可以使用其他靜態成員
生命週期一致,調用方式一致
1.3 類變量和類方法
類變量 == >靜態成員變量
類方法 ==> 靜態成員方法
類成員 ==> 靜態成員變量和靜態成員方法
1.4 靜態代碼塊
static {
// 靜態代碼塊
}
只要類文件加載,當前靜態代碼塊中的內容就一定會執行,並且有且只執行一次。
整個類的初始化過程