一、構造器命名問題:使用類名,,緣由以下:java
(1)所取得任何名字均可能與類的某個成員名相沖突。數組
(3)調用構造器是編譯器的責任,因此必須讓編譯器知道應該調用哪一個方法。(初始化期間要自動調用構造器)this
二、在java中,「初始化」和「建立捆綁在一塊兒,二者不能分離。」對象
一、當建立一個對象時,也就給此對象分配到的存儲空間取了一個值。所謂方法則是給某個動做取得名字,經過名字,你能夠引用全部的對象和方法。生命週期
二、爲了讓方法名相同而形式參數不一樣的構造器同時存在,必須用到方法重載。內存
5.2.1.區分重載方法編譯器
一、每個重載的方法都必須有一個獨立無二的參數類型列表。虛擬機
5.2.2涉及基本類型的重載編譯
一、基本類型能從一個「較小」的類型自動提高至一個「較大」的類型,此過程一旦牽涉到重載,可能會形成一些混淆。class
二、若是傳入的數據類型(實際參數類型)小於方法中聲明的形式參數類型,實際數據類型就會被提高char會提高到int型。
三、若是傳入的實際參數較大,就得經過類型轉換來執行窄化轉換。若是不這樣作,編譯器就會報錯。
5.2.3以返回值區分重載方法(行不通)
一、由於有時並不關心方法的返回值,好比此時只是會調用方法而忽略其返回值。
一、要是你沒有提供任何構造器,編譯器會默認給你建立一個無參構造器;若是已經定義了構造器,編譯器就不會再給你建立,此時若是你不本身定義一個無參構造器直接調用,編譯器回報錯。
一、調用對象的方法,即「發送消息給對象」,編譯器作了一些幕後工做,它暗自把「所操做對象的引用」做爲第一個參數傳遞給被調用的方法。
二、 (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)另外一種稱爲惰性評估,意思是即便編譯器只在必要的時候才編譯代碼。
一、java盡力保證:全部變量在使用前能獲得恰當的初始化。對於方法的局部變量,java以編譯時錯誤的形式來貫徹這種保證。
二、對於類的數據成員,會保證都會有一個初始值。
5.6.1 指定初始化
能夠在定義類成員的變量的地方爲其賦值。
一、沒法阻止自動初始化的進行,它將在構造器被調用以前發生。
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非靜態實例初始化
一、數組的兩種定義方式:int [] a 和 int a[]
二、初始化
(1)int [] a1= {1,2,3,4}
(2)int [] a2;a2=a1
5.8.1可變參數列表
一、有了可變參數,就不再用顯式地編寫數組語法了,當你指定參數時,編譯器實際上會爲你去填充數組。
二、將0個參數傳遞給可變參數列表是可行的,當具備可選的尾隨參數時,這一特性就會頗有用。
一、在你建立enum時,編譯器會自動添加一些有用的特性。
(1)toString():顯示某個enum實例的名字。
(2)ordinal():表示某個特定enum常量的聲明順序。
(3)static values():用來按照enum常量的聲明順序,產生由這些常量值構成的數組。