Java雖然利用JVM,讓程式員可以放心大膽的使用,可是仍然會出現記憶體洩露等問題。世上沒有絕對的銀彈,是以也不能完全把所有的任務都交給JVM,了解Java中的初始化與垃圾回收還是必不可少的知識。
在C中,如果要使用變量需要先申請記憶體。在Java中,如果你需要建立一個對象,也可以直接new出來,JVM會自動幫你管理。
預設的類,會自動有一個無參的構造方法,當然你也可以自己定義有參的構造方法。但是要注意,一旦自己定義了,就不再幫你自動建立無參的構造方法了。
一個類可以有多種構造方法,通過參數類型或者個數的不同,就可以實作。這就是方法的重載。甚至于參數的位置不同,都代表不同的構造方法,但是其實并沒有什麼意義。
不過,傳回值并不能進行方法的重載!因為你編碼的時候可能并不都是需要指派給另一個對象,很有可能直接使用,比如:
這樣編譯器就無法分辨到底使用哪一個了!是以傳回值是不能用來方法重載的。
另外,注意:所有的變量的初始化都會在構造器執行前進行!
static用來聲明靜态方法或者靜态變量,甚至是靜态塊。
1.如果修飾的是靜态變量,那麼無論這個類new了多少次,建立了多少對象,每個對象使用的都是同一個變量的引用,可以看做是類的共享變量。
2.如果修飾的是靜态方法,那麼你不需要建立對象,就可以直接通過類名來使用。
3.如果是靜态塊,那麼當建立對象或者通路到靜态區域的時候,就會執行一次這部分的内容,并且隻會執行一次!
其實當我們建立類或者使用類的靜态屬性時,是這樣一個步驟:
1 觸發類的通路:可能是第一次構造類,也可能是通路了類的靜态方法或者屬性
2 加載類.class,執行靜态部分
3 在堆上配置設定空間
4 存儲空間清零(這就是為什麼屬性會有預設值的原因)
5 字段初始化
6 執行構造方法
這個是老生常談的話題了,但是還總是記不住,這裡再次唠叨唠叨:
最簡單的垃圾回收方式,就是引用計數。每個對象都有一個計數器,每次引用對象,都會打一個标記;當引用null時,就會減一。這樣,計數為0時,就進行垃圾回收。
缺點就是如果出現循環引用,就沒辦法進行清除了。
标記清楚,是對所有的對象進行周遊。當出現那些沒有引用的對象,就進行标記。最後統一的把所有标記的對象,清除掉。
缺點,會出現大量的碎片化空間。
停止複制的原理,就是進行垃圾回收時,會停止應用程式的運作。把存貨的對象拷貝到另一個區域,然後剩下的全部清除掉。
缺點,就是效率低。需要拷貝全部存活對象,還要維護兩份區域。
目前使用的垃圾回收機制,基本上是上面的整合體。會首先進行标記清楚,然後碎片化太嚴重,就進行停止複制,整理位址空間。