《java編程思想》學習筆記— 初始化與清理

5.一、用構造器確保初始化

一、構造器命名問題:使用類名,,緣由以下:java

(1)所取得任何名字均可能與類的某個成員名相沖突。數組

(3)調用構造器是編譯器的責任,因此必須讓編譯器知道應該調用哪一個方法。(初始化期間要自動調用構造器)this

二、在java中,「初始化」和「建立捆綁在一塊兒,二者不能分離。」對象

5.二、方法重載

一、當建立一個對象時,也就給此對象分配到的存儲空間取了一個值。所謂方法則是給某個動做取得名字,經過名字,你能夠引用全部的對象和方法。生命週期

二、爲了讓方法名相同而形式參數不一樣的構造器同時存在,必須用到方法重載。內存

5.2.1.區分重載方法編譯器

一、每個重載的方法都必須有一個獨立無二的參數類型列表。虛擬機

5.2.2涉及基本類型的重載編譯

一、基本類型能從一個「較小」的類型自動提高至一個「較大」的類型,此過程一旦牽涉到重載,可能會形成一些混淆。class

二、若是傳入的數據類型(實際參數類型)小於方法中聲明的形式參數類型,實際數據類型就會被提高char會提高到int型。

三、若是傳入的實際參數較大,就得經過類型轉換來執行窄化轉換。若是不這樣作,編譯器就會報錯。

5.2.3以返回值區分重載方法(行不通)

一、由於有時並不關心方法的返回值,好比此時只是會調用方法而忽略其返回值。

5.3默認構造器

一、要是你沒有提供任何構造器,編譯器會默認給你建立一個無參構造器;若是已經定義了構造器,編譯器就不會再給你建立,此時若是你不本身定義一個無參構造器直接調用,編譯器回報錯。

5.4 this關鍵字

一、調用對象的方法,即「發送消息給對象」,編譯器作了一些幕後工做,它暗自把「所操做對象的引用」做爲第一個參數傳遞給被調用的方法。

二、 (1)this關鍵字只能在方法內部使用,表示對「調用法法的那個對象」的引用。

(2)若是在方法內部調用同一個類的另外一個方法,就沒必要使用this。

(3)當須要返回當前對象的引用時,就經常在return語句裏裏這樣寫:return this;

5.4.一、在構造器中調用構造器

一、若是爲this添加參數列表,那麼就有了不一樣的含義。這將產生符合此參數列表的某個構造器的明確調用。

二、儘管能夠用this調用一個構造器,但卻不能調用兩個,此外,必須將構造器調用置於最起始處,不然編譯器會報錯。

三、除構造器以外,編譯器禁止在其餘任何方法中使用this調用構造器。

5.4.2static的含義

一、static方法就是沒有this的方法,在static方法內部能能調用非靜態方法,放過來到時能夠。

5.五、清理:終結處理和垃圾回收

5.5.1 finalize()的用途何在

一、垃圾回收器只知道釋放那些經由new分配的內存。對於其餘方式分配的內存,java容許在類中頂一個個名爲finalize()的方法。它的工做原理是:一旦垃圾回收器準備好釋放對象佔用的存儲空間,將首先調用其finalize()方法,而且在下一次垃圾回收動做發生時,纔會真正回收對象佔用的內存。

二、java裏的對象並不是老是被垃圾回收

(1)對象可能不被垃圾回收

(2)垃圾回收並不等於「析構」

(3)垃圾回收只與內存有關

三、在你再也不須要某個對象以前,若是必須執行某些動做,那麼你得本身去作。

5.5.2 你必須實施清理

一、若是java虛擬機並未面臨內存耗盡的情形,它是不會浪費時間去執行垃圾回收以恢復內存的

5.5.3終結條件

5.3.4 垃圾回收器如何工做

一、引用計數器,當有引用連接至對象上時,引用計數加1

二、對於任何「活」的對象,必定能最終追溯到其存活堆棧或靜態存儲區之中的引用。

三、找到存活的對象,能夠用中止-複製的方法:

(1)先暫停程序的運行(因此它不屬於後臺回收模式),而後將全部的存活的對象從當前堆複製到另外一個堆,沒有被複制的所有都是垃圾。

(2)複製回收器,效率低,緣由以下:首先,得有兩個堆,而後得在這兩個分離的堆之間來回倒騰,從而得維護比實際須要多一倍的空間。其次,問題在於複製,程序進入穩定狀態以後,可能只會昌盛少許的垃圾,甚至沒有垃圾,這樣複製很浪費。此時能夠轉到另外一種回收模式,即自適應。

四、當須要裝載某個類(一般是在爲該類建立第一個對象)時,編譯器會先找到.class文件,而後將該類的字節碼裝入內存。此時,有兩種方案可供選擇。

(1)一種就是讓即便編譯器編譯素有代碼。這種作法有兩個缺陷:這種加載動做散落在整個程序生命週期內,累加起來要花更多時間;而且會增長可執行代碼的長度(字節碼要比即時編譯器展開後的本地機器碼小不少),這將致使頁面調度,從而下降程序的速度。

(2)另外一種稱爲惰性評估,意思是即便編譯器只在必要的時候才編譯代碼。

5.六、成員初始化

一、java盡力保證:全部變量在使用前能獲得恰當的初始化。對於方法的局部變量,java以編譯時錯誤的形式來貫徹這種保證。

二、對於類的數據成員,會保證都會有一個初始值。

5.6.1 指定初始化

能夠在定義類成員的變量的地方爲其賦值。

5.七、構造器初始化

一、沒法阻止自動初始化的進行,它將在構造器被調用以前發生。

5.7.1初始化順序

在類的內部,變量定義的前後順序決定了初始化的順序。即便變量定義散步於方法定義之間,他們仍舊會在任何地方(包括構造器)被調用以前獲得初始化。

5.7.2靜態數據的初始化

一、static關鍵字不能應用於局部變量,所以它只能做用於域

二、初始化的順序是先靜態對象(若是它們還沒有因前面的對象建立過程而被初始化),然後是「非靜態」對象。

三、總結一下對象的建立過程 (1)即便沒有顯式地使用static關鍵字,構造器實際上也是靜態方法。所以,當首次建立類的對象時,或者類的靜態方法/靜態域首次被訪問時,java解釋器必須查找類路徑,以定位.class文件。

(2)而後載入.class文件,有關靜態初始化的全部動做都會執行。

(3)當用new建立對象的時候,首先將在堆上的對象分配足夠的存儲空間。

(4)這塊存儲空間會被清零,這就自動地將對象的全部基本類型數據設置成了默認值,而引用則被設置成了null。

(5)執行全部出現於字段定義處的初始化動做。

(6)執行構造器。

5.7.3 顯示的靜態初始化

5.7.4非靜態實例初始化

5.8數組初始化

一、數組的兩種定義方式:int [] a 和 int a[]

二、初始化

(1)int [] a1= {1,2,3,4}

(2)int [] a2;a2=a1

5.8.1可變參數列表

一、有了可變參數,就不再用顯式地編寫數組語法了,當你指定參數時,編譯器實際上會爲你去填充數組。

二、將0個參數傳遞給可變參數列表是可行的,當具備可選的尾隨參數時,這一特性就會頗有用。

5.九、枚舉類型

一、在你建立enum時,編譯器會自動添加一些有用的特性。

(1)toString():顯示某個enum實例的名字。

(2)ordinal():表示某個特定enum常量的聲明順序。

(3)static values():用來按照enum常量的聲明順序,產生由這些常量值構成的數組。

相關文章
相關標籤/搜索