→靜態:static
用法:是一個修飾符,用於修飾成員(成員變量,成員函數)
class Person { String country = "cn"; }
/*每實例化一個Person對象,每個物件在堆記憶體中都有一個country
而加上static以後,就只在記憶體總存在一個靜態的country被其他的物件直接調用,可以節省記憶體空間。
當成員被靜態修飾以後,除了可以被物件呼叫外,還可以直接被類別名稱呼叫。 */
特有內容隨著物件儲存
例如person類,每個中國人都有自己的名字,而國籍都是一樣的中國,所以contry可以定義為static而name不用。
→static特點
1、隨著類別的載入而載入
也就是說:靜態會隨著類別的消失而消失,說明他的生命週期最長
2、優先於物件存在
3、被所有物件共享
4、可以直接被類別名稱呼叫
→int age(成員變數)實例變數與static int age(靜態成員變數)類別變數的差異
1、存放為著
實例變數是隨著物件的建立而存在堆記憶體中
類別變數隨著類別的載入而存在於方法區中
#2、生命週期
實例變數隨著對象的消失而消失
類別變數生命週期最長,隨著類別的消失而消失
→靜態使用注意事項
1、靜態方法只能存取靜態成員
2、靜態方法中不可以定義this,super關鍵字
因為靜態優先於物件存在,所以靜態方法中不可以出現this
#3、主函數是靜態的
→靜態的好處和壞處
好處:對物件的資料進行單獨空間的存儲,節省空間,沒有必要每個物件中的存儲一份
可以直接被類別名稱呼叫(Person.country)
壞處:生命週期過長。
存取出現限制。 (只能存取靜態)
→什麼時候使用靜態呢?
要從兩個面向入手
因為靜態修飾的內容有成員變數和成員方法(函數)
什麼時候定義靜態變數(類別變數)呢?
當物件中出現共享資料時,該資料會被靜態所修飾
物件中的特有資料要定義成非靜態存在於堆記憶體中。
什麼時候定義靜態函數呢?
當功能內部沒有存取到非靜態資料(物件的特有資料),那麼該功能可以定義為靜態的。
→靜態的應用
每一個應用程式都有共通性的功能
可以將這些功能進行抽取,並獨立封裝
以便複用。
把成員方法都定義成static的直接用類別名稱呼叫。
一個類別中會有一個預設的建構子,這個建構子的權限和所屬的類別一致
靜態程式碼區塊
格式:
static
{
靜態程式碼區塊中的執行語句;
}
//特點:隨著類別的載入而執行,只執行一次。用於給類別進行初始化。
如下範例:
class StaticCode { static { System,out.println("a"); } }
載入順序靜態程式碼區塊-->建構程式碼區塊-->建構子
物件的初始化過程
Person p = new Person("zhangsan",20);
1、因為new用到了Person.class。所以會先找到Person.class檔並載入到記憶體中。
2、執行該類別中的static程式碼區塊(靜態程式碼區塊),如果有的話,給Person.class類別進行初始化
3、在堆記憶體中開闢空間,非配記憶體位址
4、在堆記憶體中建立物件的特有屬性,並進行預設初始化
5、對屬性進行顯示初始化
6.對物件進行建構程式碼區塊初始化
7、對物件進行對應的建構子初始化
#8、將記憶體位址付給堆疊記憶體中的p變數
以上是php中static(靜態)關鍵字的特點與用法詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!