天天看點

Java程式員的日常—— 《程式設計思想》關于類的使用常識

Java雖然利用JVM,讓程式員可以放心大膽的使用,可是仍然會出現記憶體洩露等問題。世上沒有絕對的銀彈,是以也不能完全把所有的任務都交給JVM,了解Java中的初始化與垃圾回收還是必不可少的知識。

在C中,如果要使用變量需要先申請記憶體。在Java中,如果你需要建立一個對象,也可以直接new出來,JVM會自動幫你管理。

預設的類,會自動有一個無參的構造方法,當然你也可以自己定義有參的構造方法。但是要注意,一旦自己定義了,就不再幫你自動建立無參的構造方法了。

一個類可以有多種構造方法,通過參數類型或者個數的不同,就可以實作。這就是方法的重載。甚至于參數的位置不同,都代表不同的構造方法,但是其實并沒有什麼意義。

不過,傳回值并不能進行方法的重載!因為你編碼的時候可能并不都是需要指派給另一個對象,很有可能直接使用,比如:

這樣編譯器就無法分辨到底使用哪一個了!是以傳回值是不能用來方法重載的。

另外,注意:所有的變量的初始化都會在構造器執行前進行!

static用來聲明靜态方法或者靜态變量,甚至是靜态塊。

1.如果修飾的是靜态變量,那麼無論這個類new了多少次,建立了多少對象,每個對象使用的都是同一個變量的引用,可以看做是類的共享變量。

2.如果修飾的是靜态方法,那麼你不需要建立對象,就可以直接通過類名來使用。

3.如果是靜态塊,那麼當建立對象或者通路到靜态區域的時候,就會執行一次這部分的内容,并且隻會執行一次!

其實當我們建立類或者使用類的靜态屬性時,是這樣一個步驟:

1 觸發類的通路:可能是第一次構造類,也可能是通路了類的靜态方法或者屬性

2 加載類.class,執行靜态部分

3 在堆上配置設定空間

4 存儲空間清零(這就是為什麼屬性會有預設值的原因)

5 字段初始化

6 執行構造方法

這個是老生常談的話題了,但是還總是記不住,這裡再次唠叨唠叨:

最簡單的垃圾回收方式,就是引用計數。每個對象都有一個計數器,每次引用對象,都會打一個标記;當引用null時,就會減一。這樣,計數為0時,就進行垃圾回收。

缺點就是如果出現循環引用,就沒辦法進行清除了。

标記清楚,是對所有的對象進行周遊。當出現那些沒有引用的對象,就進行标記。最後統一的把所有标記的對象,清除掉。

缺點,會出現大量的碎片化空間。

停止複制的原理,就是進行垃圾回收時,會停止應用程式的運作。把存貨的對象拷貝到另一個區域,然後剩下的全部清除掉。

缺點,就是效率低。需要拷貝全部存活對象,還要維護兩份區域。

目前使用的垃圾回收機制,基本上是上面的整合體。會首先進行标記清楚,然後碎片化太嚴重,就進行停止複制,整理位址空間。