1. 程式人生 > >又讀Thinking in Java

又讀Thinking in Java

初始化過程 碎片 技術 適應 表示 忘記 操作系統 可變 方法名

前幾天又把Thinking in Java的第五章看了一遍,當然。又是收獲多多,盡管沒有去年第一次看到這本書時的興奮——當時每天非常晚下班回宿舍後都是必看一點的,可是也撿起了不少忘掉的東西。


本章的標題是:初始化與清理


首先講述了構造器的由來:在使用對象前,我們都必須確保該對象經過了初始化,那麽能夠在每一個類中定義一個方法:initialize()(這名字讓人想到了非常多設計都用到了名為init()的這種方法),每次我們使用對象前都先調用一下此方法。

那麽問題來了:假設我們忘記了調用怎麽辦呢?出現了問題則必需要有對應的對策來解決,所以人們想到了構造器,讓全部需要初始化的工作都在構造器中完畢。那麽構造器又是個什麽東西呢?作者也沒有說,就直接談到了構造器。

依照我的理解就是:構造器就是一個方法或者說是一個入口,這種方法是用來創建對象的。

然後人們就想辦法設計了這種方法(構造器),定義了一些規則:與類同名。無返回值……這裏作者提到了一句:new表達式確實返回了對新建對象的引用,可是構造器本身並沒有不論什麽返回值。這句話能夠讓人好好想想為什麽構造器沒有返回值了。


創建對象時:先在內存中分配存儲空間,然後調用構造器。


方法重載:Overload。

同一個類中多個方法名同樣。但參數列表不同。

重載就是為了偷懶(方便)。

構造器是一個方法,當然也能夠重載。

重載的唯一區分方式:獨一無二的參數類型列表。

訪問權限、返回值類型、拋出的異常都不能決定該方法是不是重載的。思考個問題:static方法與同名的實例方法是重載的嗎?


thiskeyword:

this僅僅能在方法內部使用,表示調用該方法的那個對象。

在構造器中使用this()方法調用其它構造器。


statickeyword:static修飾的屬性與方法屬於類全部。該類全部對象共享之。


重點來了:清理內存和垃圾回收

創建對象時有一個初始化過程(盡管該過程被構造器所替代了),那麽放棄使用該對象時也應該有個與之相應的銷毀過程,於是人們為每一個類定義了一個finalize()方法,每次釋放該對象所占用的內存空間時先調用該方法然後再清理該內存。

記得學C++時有個析構函數,貌似是類名方法前加個~,每次要自己調用該方法來做清理工作,然後Java為了提高開發者的工作效率,不再這麽做了,程序猿不須要自己調用finalize方法。由Java內部的垃圾回收器依據他們自定義的條件去運行。

主要講垃圾回收器的工作原理:書上也沒寫個絕對的方法,僅僅是提到了這麽幾種思路。

1、引用計數法:每一個對象都有一個引用計數器,每次有引用連接到該對象時將計數器加1。當引用斷開與該對象的連接時計數器減1,當計數器為0時則將該對象占用的空間釋放。

可是有個缺陷,假設有循環引用,即假設A引用了B,而B又引用了A,那麽這就成了個死結,推斷起來太麻煩,所以這樣的方法從未被實現過。

2、自適應的技術:遍歷全部的引用,查找活著的對象,然後清理。這也有兩種實現的方法:一、停止然後復制(stop-and-copy):就是將全部存活著的對象拷貝到一個新的堆中,然後清理原來的堆,這樣要更新全部的引用;二:標記清掃(mark-and-sweep):標記存活的對象,然後將未標記的對象都清理掉,這樣會產生非常多碎片空間。兩種方法各有利弊。當然要結合起來用咯。

這就涉及到了很多其它操作系統方面的知識。記得學操作系統時也是講過內存管理的。

再就是提到了一種即時編譯器技術JIT(Just-In-Time):為了提高效率,使用時才編譯class文件成機器碼。


成員初始化也是一個非常重要的點。

寫一個過程吧:首先加載.class文件→創建Class的對象,代表該類文件→全部static成員或代碼塊運行初始化→new一個對象→在堆上分配空間,然後清零該片空間→全部實例變量設置成默認值(8中基本類型+引用類型)→運行字段定義處的初始化動作→運行構造器


數組與可變參數列表


枚舉enum


嗯,就這些了吧~

希望有人能好好交流下,每次看完東西認為學到了非常多。可是一段時間不用就忘了。事實上認為當老師是一份不錯的工作,時刻滾固著再然後用一下,再然後想一下就會有新東西新想法出來了~事實上不是有非常多成功的人都是當過老師嘛~馬雲、俞敏洪、李陽……(*^__^*) 嘻嘻……自己YY一下




又讀Thinking in Java