static關鍵字的使用與記憶體分析

2021-09-01 13:22:50 字數 2306 閱讀 9890

一、使用小述

1.     首先解釋一下static是什麼意思?

static是靜態的意思,既然是靜態,就是不變的,而不變就是他不會因為類中例項化物件的不同而不同,它在類中永遠只有乙份,就像中國人有許多,但我們只有乙個國家中國。

2.由static修飾的歸屬問題

由static修飾的不管是變數還是方法,都屬於類直接管理,所以類中所有的方法(這裡方法包括靜態和例項)都可以呼叫他們,就像公司裡的印表機,它是屬於公司的,公司裡的人員(例項)都可以用它。

例如:

class program

void aa()

}

3.static修飾的範圍

①static可以修飾類,使類成為靜態類。這樣在此類中只能定義靜態的方法和靜態的變數。

②static可以修飾變數,這個變數只能是成員變數,不能是區域性的。

既不能修飾方法體中的變數,以及形式引數。

③static可以修飾方法,main方法必須用static修飾,因為它是與程式共存亡的,是程式的入口和結束的大門。

例如:

class test

}

static class test

//正確

void bb() {}  //錯誤,靜態類不能定義例項方法

}

4.static修飾的呼叫

①在本類裡呼叫由static修飾的方法和變數,可以直接用

class a

static void bb()

}

②在外類中呼叫static修飾的方法和變數,類名。方法名

或類名。變數名

class program

}

class test

二、static關鍵字所導致的記憶體洩漏問題

大家都知道記憶體洩漏和記憶體溢位是不一樣的,記憶體洩漏所導致的越來越多的記憶體得不到**的失手,最終就有可能導致記憶體溢位,下面說一下使用staitc屬性所導致的記憶體洩漏的問題。

在dalvik虛擬機器中,static變數所指向的記憶體引用,如果不把它設定為null,gc是永遠不會**這個物件的,所以就有了以下情況:

非靜態內部類的靜態引用。然後在2秒之後我們要finish掉這個activity,會造成什麼問題呢?我們知道,內部類和外部類之間是相互持有引用的,secondactivity例項持有了haha的引用,但這裡haha是用static修飾的,上面說了,虛擬機器不會**haha這個物件,從而導致secondactivity例項也得不到**,造成記憶體溢位。

這貨還在這得不到**。

怎麼解決這個問題呢,很簡單,只要在activity的ondestroy方法裡把haha設為null就行啦

那麼還有另外一種情況,單例的問題。單例也是用了其static屬性,很多單例,往往需要用到context物件,而又是通過傳值的方式獲得,比如:

先來乙個單例

再來乙個activity來用它,context傳入乙個this,再2秒之後關閉activity

後來我們發現這貨還在,又是得不到**:

使用static關鍵字

在前面的課程中,你學到了區域性變數 有塊範圍 和全域性變數 有計畫的範圍 還有另乙個作用域的變數,可以水平 檔案範圍。檔案範圍內的變數可以被訪問的任何功能或嵌在乙個單一的檔案。申報檔案作用域的變數,簡單地宣告乙個變數,一塊外 同乙個全域性變數 但使用static關鍵字 123 4567 static...

使用static關鍵字

在前面的課程中,你學到了區域性變數 有塊範圍 和全域性變數 有計畫的範圍 還有另乙個作用域的變數,可以水平 檔案範圍。檔案範圍內的變數可以被訪問的任何功能或嵌在乙個單一的檔案。申報檔案作用域的變數,簡單地宣告乙個變數,一塊外 同乙個全域性變數 但使用static關鍵字 123 4567 static...

static關鍵字使用

版本 v1.0 public class study 6 1 class person4 靜態使用注意事項 1.靜態方法只能訪問靜態成員 非靜態的方法既可以訪問靜態也可以訪問非靜態 這點注意先後順序就可以理解 2.靜態方法中不可以定義this,super等關鍵字 因為靜態優先於物件存在。所以靜態方法...