1. 程式人生 > >靜態方法和例項方法聯絡與區別

靜態方法和例項方法聯絡與區別

1、呼叫方式上

靜態方法依賴於類,通過類.靜態方法呼叫;例項方法依賴於類的物件,需要建立物件後,物件.例項方法使用

2、使用上

例項方法內部不能定義靜態變數,會出現編譯錯誤;例項方法可以直接呼叫靜態方法;靜態方法內部可以定義和使用例項變數,靜態方法無法直接呼叫例項方法(因靜態方法載入時類還沒有例項化,例項方法依賴於類的物件)

3、靜態方法和例項方法的記憶體分配問題

一般認為靜態方法常駐記憶體,例項方法只有在使用時才分配記憶體。但事實上,是一樣的,都是在類被載入時常駐記憶體。static方法和non-static方法在建立例項物件時,屬性的值對各個物件各不相同(每個例項物件的所有欄位在記憶體中有一個拷貝,用於區分操作哪個物件的欄位),new一個例項時,會把例項屬性放在GC Heap裡面,同時new的物件放在堆疊上,堆疊指標指向剛才拷貝的的記憶體地址;而靜態方法中的靜態欄位只有一份;對於static和non-static方法程式碼都是一樣的,所以只需要一份程式碼,佔用一份記憶體空間。呼叫速度上因例項方法需要例項化分配記憶體,靜態方法則不用,故靜態方法會快一點,但也可忽略不計

4、區分靜態方法和例項方法的原因

早期結構化程式設計幾乎所有方法都是靜態方法,引入例項化方法的概念是在面向物件概念出現以後,區分靜態方法和例項方法不能單單從效能上理解。建立c++、java、c#這樣面嚮物件語言的大師引入例項化方法一定不是要解決什麼效能、記憶體的問題,而是為了讓開發更加模式化、面向物件化。這樣說的話,靜態方法和例項化方式的區分是為了解決模式的問題

5、適用場景

靜態方法:一個方法與類的物件無關,如工具類等

例項方法:一個方法依賴於類的物件;多執行緒場景下,如果靜態方法中含有靜態變數,如果對靜態變數進行更改操作易造成執行緒安全問題

6、靜態方法與單例模式

如果一個方法與物件的例項無關用靜態方法,反之採用例項方法,但如果方法和物件的例項有關,又想維護一份例項時,需要用單例模式。如系統執行時,需要載入一些的配置和屬性,是公共的,需要在整個生命週期存在,只需要一份就可以,但此時這些配置和屬性又是通過面向物件的編碼方式得到的,雖然用靜態方法也能解決,但最好的方式是採用單例模式