---------------------- asp.net+unity開發、.net培訓、期待與您交流! ----------------------
static關鍵字
由同乙個類建立的所有物件共享,在記憶體中只載入一次
靜態修飾的成分儲存在方法區或者共享區或者資料區
盡量少設定過多的靜態,會占用太多的空間
隨著類的載入而載入,也就是說類載入一次,static修飾的成員也只載入一次
類存在則靜態存在,類消失則靜態消失
優先於物件存在,也就是說靜態先存在,然後物件才存在
被所有由同乙個類所建立的所有物件共享
可以直接被類名所呼叫,也就是說不需要通過建立物件再由物件呼叫,而是直接:類名.靜態成員
例項變數和類變數(靜態變數)的區別:
存放位置
類變數隨著類的載入而存在於方法區中
例項變數隨著物件的建立而存在與堆記憶體中
生命週期
類變數的生命週期最長,隨著類的消失而消失
例項變數生命週期隨著物件的消失而消失
靜態使用注意事項:
靜態方法只能訪問靜態成員
非靜態方法可以訪問靜態成員
靜態方法中不可以定義this(),
super()
靜態方法中不可以出現「this.*」
靜態有利有弊:
有利:對物件的共享資料進行單獨空間的儲存,沒有必要每乙個物件中都儲存乙份,節省空間
可以直接被類名呼叫
弊端:生命週期過長
訪問出現侷限性(靜態雖好,只能訪問靜態)
什麼時候使用靜態?
當物件出現共同共享資料時,比如:同乙個國家的人的國籍
而物件中的特有資料(物件自定義的)要定義成非靜態存在與堆記憶體中
什麼時候定義靜態函式?
當功能內部沒有訪問到非靜態資料(物件的特有資料)
靜態的應用
例如:程式設計師自己開發的一些工具類,然後靜態呼叫
//寫乙個工具類
class arraytool
public static int getmax(int arr)
return arr[max];
}}
用main函式呼叫
class demo
; //呼叫靜態方法
arraytool.getmax(arr);
}}
靜態**塊:
格式:
static
特點:
隨著類的載入而執行,只執行一次,即使呼叫兩次含有靜態**塊的類也只會執行第一次,而第二次不執行
優先於主函式
構造**塊:
物件一建立就執行,但是優先於建構函式
每次例項化物件不管是有參的還是無參的都得執行,這樣就
提高了**的的重用性
class test
test(){}//無參建構函式
test(int i){}//有參建構函式 }
類初始化的時候會執行到的**塊
static
建構函式初始化**塊,也就是建立物件的時候會執行到的**塊
因此靜態**塊裡面不能引用非靜態成員,
靜態**塊和靜態函式被載入的時候根本找不到引用的非靜態成員,會發生空引用異常
物件初始化過程
1、因為new用到了person.class,所以會先找到person.class檔案並載入到記憶體中
2、執行該類中的static**塊,如果有的話,給person.class類進行初始化
3、在堆記憶體中開闢空間,分配記憶體位址
4、在堆記憶體中建立物件的特有屬性,並進行預設初始化(非靜態成員)
5、對屬性進行顯示初始化(賦值)
6、對物件進行構造**塊初始化
7、對物件進行對應的建構函式初始化
8、將記憶體位址賦值給棧記憶體中的***變數
---------------------- asp.net+unity開發、.net培訓、期待與您交流! ----------------------詳細請檢視:www.itheima.com
黑馬程式設計師 static
asp.net android io開發s net培訓 期待與您交流!靜態static 是乙個修飾符,可以修飾成員變數,成員函式 只能是成員 從堆記憶體拿出 來放在方法區。被他所修飾的 是共性變數。人有國籍,國籍就是共性 成員被靜態修飾以後,除了能被物件呼叫外,還能被類名呼叫。寫法 類名.靜態成員 ...
黑馬程式設計師 static靜態關鍵字
靜態關鍵字用於修飾成員。被修飾的成員具備以下特點 1.隨著類的載入而載入。2.優先於物件。3.被所以物件所共享。4.可以直接被類名呼叫。使用注意點 1.靜態方法只能訪問靜態成員。非靜態方法即可以訪問靜態頁可以訪問非靜態。2.靜態方法中不可以寫this,super關鍵字。3.主函式是靜態的。靜態的利與...
黑馬程式設計師 靜態方法和靜態類
靜態方法 靜態 例項 非靜態 static關鍵字 不需要static關鍵字 使用類名呼叫 使用例項物件呼叫 在靜態方法中可以訪問靜態成員 在例項方法中 可以直接訪問靜態成員 在靜態方法中,不可以直接訪問例項成員,需要建立物件,通過物件呼叫 在例項方法中,可以直接訪問例項成員 呼叫前初始化 例項化物件...