1. 程式人生 > >java對static簡單認識

java對static簡單認識

static簡單認識:

static作用:只要使用static的地方,jvm就會在編譯器對這些資訊進行載入,完成對記憶體的一次申請,那麼這個記憶體是什麼時候進行釋放呢,要在程式執行完成之後釋放,還有一個問題就是這個記憶體在什麼地方進行申請,是屬於永久代嗎(請看jvm記憶體管理),是不是static用的越多越好呢,那我們應該什麼時候用呢,那我們可以不可以在想一下,java的設計者是如何用static這個關鍵字就能實現有關資訊在編譯器執行呢?,如果讓我們設計將怎樣做?

1. static用在方法上

static在方法上,可以不用產生類的物件例項,直接可以通過類名直接呼叫方法,節省對記憶體的消耗,可以理解為它是共有的,比如像在連線資料庫時,可以把getConnection做成靜態方法,但是這樣會不會存線上程問題呢,肯定是存線上程問題的,因為存在共享記憶體的問題,比如像在一個方法內部,有一個變數,這個變數如果是方法的區域性變數,那麼它就不會存線上程問題,因為·每一個方法都會產生一個棧,那麼每一個棧裡面的內容都是私有的,如果這個變數是一個成員變數或者被static進行修飾,那麼它將產生執行緒問題,因為這個成員變數被共享。在這個問題上,我們可以加上synchronize關鍵字,但是這個鎖的力度是不是比較大呢,可以看(java併發程式設計裡面的synchronize

)。

2. staic用在變數上

static也可以在變數上使用,它的主要作用是什麼呢,就是方便我們訪問這個變數,在物件之間共享,static不能修飾區域性變數,因為是區域性變數會在方法執行完成之後,jvm虛擬機器會釋放記憶體,但是static修飾的成員變數需要在程式結束之後,才能釋放記憶體。

所以這兩個發生矛盾,所以我們不能修飾區域性變數。

3.static用在靜態塊上

在類載入執行這些靜態塊,初始化裡面的變數和方法,靜態塊首先不能存在任何方法體內,為什麼不能存在方法體內,大家仔細想一想,如果存在方法體內,是不是就會失去靜態塊的作用,因為它的作用是在類載入時執行裡面的方法和變數,這就是為什麼靜態塊不能存在方法體內。假設這個類裡面有多個靜態塊,那麼問題將產生,它是如何執行的呢,通過程式驗證發現它是按照先後順序執行的,那麼問題將產生,我們為啥要在類裡面寫多個靜態塊呀,其實它的作用就是在類載入執行這些靜態塊,我感覺java的設計者是不是多此一舉,大家有不同想法,我們可以進行探討