static
?關鍵字的 “特殊性” 主要體現在其與類、對象的綁定關系,以及由此帶來的一些反常規規則,具體如下:
生命周期與內存位置特殊
- 靜態成員(變量 / 方法)隨類加載而創建,隨類卸載而銷毀,生命周期與類一致,遠長于對象(對象隨創建而存在,垃圾回收時銷毀)。
- 靜態變量存儲在方法區(而非堆內存),所有對象共享同一份,修改時會影響所有使用該變量的地方。
訪問方式特殊
- 可直接通過?
類名.成員
?訪問,無需創建對象(非靜態成員必須通過對象訪問)。 - 即使對象被銷毀,靜態成員仍可正常訪問(只要類未卸載)。
- 可直接通過?
內部限制特殊
- 靜態方法中不能直接使用非靜態成員(變量 / 方法),因為非靜態成員依賴對象存在,而靜態方法調用時可能無對象。
- 靜態方法中不能使用?
this
?或?super
?關鍵字,因為?this
?指向當前對象,而靜態方法不依賴對象。
繼承與重寫的特殊性
- 靜態方法不能被重寫(Override),只能被 “隱藏”(子類定義同名靜態方法時,父類方法被隱藏,而非重寫)。
- 調用靜態方法時,實際執行的版本由編譯時類型決定(非靜態方法由運行時類型決定),違背多態的動態綁定規則。
靜態內部類的獨立性
- 靜態內部類可獨立實例化,無需先創建外部類對象;而非靜態內部類必須依賴外部類對象存在。
- 靜態內部類中不能訪問外部類的非靜態成員,只能訪問外部類的靜態成員。