androidstatic
1. android static變數為什麼會導致內存溢出
Android 內存溢出的原因和解決方案如下: 1.Android的虛擬機是基於寄存器的Dalvik,它的最大堆大小一般是16M,有的機器為24M.因此我們所能利用的內存空間是有限的.如果我們的內存佔用超過了一定的水平就會出現OutOfMemory的錯誤.原因主要有兩個: l 由於我們程序的失誤,長期保持某些資源(如Context)的引用,造成內存泄露,資源造成得不到釋放. l 保存了多個耗用內存過大的對象(如Bitmap),造成內存超出限制. 2. Static static是Java中的一個關鍵字,當用它來修飾成員變數時,那麼該變數就屬於該類,而不是該類的實例.所以用static修飾的變數,它的生命周期是很長的,如果用它來引用一些資源耗費過多的實例(Context的情況最多)就要謹慎對待了.例如xxx源碼: public class IntentMapping { private static Contextcontext; //. . . }
2. android中的static
1. static變數
按照是否靜態的對類成員變數進行分類可分兩種:一種是被static修飾的變數,叫靜態變數或類變數;另一種是沒有被static修飾的變數,叫實例變數。兩者的區別是:
對於靜態變數在內存中只有一個拷貝(節省內存),JVM只為靜態分配一次內存,在載入類的過程中完成靜態變數的內存分配,可用類名直接訪問(方便),當然也可以通過對象來訪問(但是這是不推薦的)。對於實例變數,沒創建一個實例,就會為實例變數分配一次內存,實例變數可以在內存中有多個拷貝,互不影響(靈活)。
2. static代碼塊
static代碼塊是類載入時,初始化自動執行的。如果static代碼塊有多個,JVM將按照它們在類中出現的先後順序依次執行它們,每個代碼塊只會被執行一次。
3. static方法
static方法可以直接通過類名調用,任何的實例也都可以調用,因此static方法中不能用this和super關鍵字,不能直接訪問所屬類的實例變數和實例方法(就是不帶static的成員變數和成員成員方法),只能訪問所屬類的靜態成員變數和成員方法。因為static方法獨立於任何實例,因此static方法必須被實現,而不能是抽象的abstract。
static方法只能訪問static的變數和方法,因為非static的變數和方法是需要創建一個對象才能訪問的,而static的變數/方法不需要創建任何對象。
********
static的數據或方法,屬於整個類的而不是屬於某個對象的,是不會和類的任何對象實例聯繫到一起。所以子類和父類之間可以存在同名的static方法名,這里不涉及重載。所以不能把任何方法體內的變數聲明為static,例如:
fun() {
static int i=0; //非法。
}
其實理解static是只有一個存儲地方,而使用時直接使用,不需要創建對象,就能明白以上的注意事項。
另外,一般的類是沒有static的,只有內部類可以加上static來表示嵌套類。