讀了前半本<Thinking in Java>

來源:互聯網
上載者:User

標籤:

讀了1-14章。
這本書真的不適合初學者,可能比較適合有一兩年Java經驗的人來讀。
學習真的是一個螺旋遞進的過程。剛開始學Java基本文法,書上看到的很多東西覺得過於細枝末節,沒見過,用不上,導致書看不下去了。後來學Java Web,發現實際應用中真的會用到很多東西,有了書到用時方恨少的感覺,覺得不補充基礎知識就學不下去了。於是又拿來這本書看,前14章算是認真讀了,還做了筆記,算是有所收穫,但也越來越覺得讀不下去了。讀到第15章 泛型,實在讀不下去了。
接下來打算繼續學Java Web,再有書到用時方恨少的感覺的時候迴歸《Core Java》,初學者還得看這本。

 

 

第二章 一切都是對象

 

在Java中你所做的全部工作就是定義類,產生那些類的對象,以及發送訊息給這些對象。

類中兩種類型的元素:欄位和方法。

 

Java消除了“向前引用”問題。


當聲明一個事物是static時,就意味著這個域或方法不會與包含它的那個類的任何對象執行個體關聯在一起。所以,即使從未建立某個類的任何對象,也可以調用其static方法或訪問其static域。


一個static欄位對每個類來說都只有一份儲存空間,而非static欄位則是對每個對象有一個儲存空間。

 

 

第三章 操作符

 

整數除法,或將小數轉換為整型時,會直接去掉結果的小數位,而不是四捨五入。


關係操作符==和!=適用於對象。比較的是對象的引用。
equals()的預設行為是比較引用。大多數類庫都實現了equals()方法,用來比較對象的內容。


直接常量:尾碼L代表long,F代表float,D代表double。首碼0x十六進位數,0八位元。(以上字母大小寫均可)


指數記數法:float f = 1e-43f;

 

 

第四章 控制執行流程

 

foreach可用於數組和其它任何Iterable對象。

for(float x : f){ }


label:位於剛好在迭代語句之前。使用標籤的唯一理由是因為有迴圈嵌套存在,而且想從多層嵌套中break或continue.

 

第五章 初始化與清理


構造器名稱與類名完全相同(首字母大寫)。

構造器沒有傳回值。

編譯器暗自把“所操作對象的引用”作為第一個參數傳遞給調用的方法。

this關鍵字只能在方法內部使用,表示對“調用方法的那個對象”的引用。

在方法內部調用同一個類的另一個方法,就不必用this.

在構造器中,可以用this調用另一個構造器,且必須將調用置於最起始處。
Flower(int a){
this.a = a;
}
Flower(String s, int a){
this(a);
this.s = s;
}

static方法就是沒有this的方法。

在static方法的內部不能調用非static方法。

方法的局部變數未初始化,得到編譯時間錯誤。
類的欄位如果是基本類型,未初始化會得到預設初始值。
類裡定義一個對象的引用,如果不初始化,此引用得到特殊值null.

顯式的靜態初始化:靜態塊static{},這段代碼僅執行一次:當首次產生這個類的一個對象時,或者首次訪問屬於那個類的待用資料成員時。

將一個數組賦值給另一個,只是複製引用。

所有數組都有一個固有成員length.


第六章 存取權限控制


Java原始碼檔案通常被稱為編譯單元,必須有一個尾碼名.java。編譯單元內可以有一個public類,該類的名稱必須與檔案名稱相同。每個編譯單元只能有一個public類。


第七章 複用類


當建立了一個匯出類對象時,該對象包含了一個基類的子物件。

如果沒有預設的基類構造器,或者想調用一個帶參數的基類構造器,就必須用關鍵字super顯式地編寫調用基類構造器的語句,並且配以適當的參數列表。

想要覆寫方法時可以添加@Override註解,如果不留心重載而非覆寫了這個方法,編譯器會建置錯誤資訊。

final基本類型使數值恒定不變,而用於對象引用,final使引用恒定不變。

一種典型的定義常量的方式:定義為public則可用於包之外;定義為static則強調只有一份;定義為final則說明是一個常量。

Java允許在參數列表中以聲明的方式將參數指明為final.

final方法:防止任何繼承類修改,不會被覆蓋。

所有的private方法都隱式地指定為final.

final類:不能被繼承,沒有子類。


第八章 多態


後期綁定,含義是在運行時根據對象的類型進行綁定。也叫動態綁定或運行時綁定。

除了static方法和final方法(private方法屬於final方法),其它所有方法都是後期綁定。

在構造器內部調用正在構造對象的某個動態Binder 方法,結果可能難以預料。因此編寫構造器應用儘可能簡單的方法使對象進入正常狀態,如果可以的話,避免調用其它方法。

Java中所有轉型都會得到檢查。在運行期間對類型進行檢查的行為稱作“運行時類型識別”(RTTI)。轉型失敗會返回ClassCastException.


第九章 介面


抽象方法,僅有聲明而沒有方法體。

包含抽象方法的類稱作抽象類別。

要想建立一個介面,用interface關鍵字取代class關鍵字。

介面可以包含域,這些域隱式地是static和final的。

即使不顯式聲明,介面中的方法必須是public的。

使用介面的核心原因:為了能夠向上轉型為多個基底類型(以及由此帶來的靈活性)。第二個原因與使用抽象基類相同:防止用戶端程式員建立該類的對象,並確保僅僅是建立一個介面。

適配介面:我們可以在任何現有類上添加新的介面,所以這意味著讓方法接受介面類型,是一種讓任何類都可以對該方法適配的方式。這就是使用介面而不是類的強大之處。


第十章 內部類


一種典型的情況是,外部類將有一個方法,該方法返回一個指向內部類的引用。

如果想從外部類的非靜態方法之外的任意位置建立某個內部類的對象,那麼必須具體地指明這個對象的類型:OuterClassName.InnerClassName.

內部類擁有對其外部類所有成員的訪問權。

需要獲得對外部類對象的引用,可以使用外部類的名字後面緊跟.this。

除非建立的是嵌套類(靜態內部類),在擁有外部類對象前,不可能建立內部類對象。

.new文法:
Outer o = new Outer();
Outer.Inner i = o.new Inner();

嵌套類:當內部類是static時,要建立嵌套類對象,並不需要其外圍類的對象。嵌套類沒有this引用指向外圍類對象。

一個內部類被嵌套多少層並不重要,它能透明地訪問所有它所嵌入的外圍類的所有成員。


第十一章 持有對象


與數組不同,Java容器類都可以自動地調整自己的尺寸。

為什麼需要內部類:
一般來說,內部類繼承自某個類或實現某個介面,內部類的代碼操作建立它的外圍類的對象。

 

每個內部類都能獨立地繼承自一個(介面的)實現,所以無論外圍類是否已經繼承了某個(介面的)實現,對於內部類都沒有影響。

 

內部類有效地實現了“多重繼承”。也就是說,內部類使得允許繼承多個非介面類型(類或抽象類別)。

通過使用泛型,就可以在編譯期防止將錯誤類型的對象放置到容器中。

List:
ArrayList,優勢隨機訪問元素。
LinkedList,優勢插入和刪除操作,更多特性。

Set:不儲存重複元素。常用HashSet實現,它專門對快速尋找作了最佳化。

Map:將對象映射到其它對象的能力。Map可以返回它的鍵的Set,它的值的Collection,它的索引值對的Set。

Queue:隊列是先進先出容器,常被當作一種可靠的將對象從程式的一個地區傳送到另一個地區的途徑。

迭代器Iterator:

(1)使用方法iterator()要求容器返回一個Iterator。Iterator將準備好返回序列的第一個元素。

(2)使用next()獲得序列中的下一個元素。

(3)使用hasNext()檢查序列中是否還有元素。

(4)使用remove()將迭代器新近返回的元素刪除。

實現Collection就意味著需要提供iterator()方法。

Iterable介面,包含一個產生Iterator的iterator()方法,並且Iterater介面可被foreach用來在序列中移動。

容器不能持有基本類型,但有自動封裝機制協助。


第十二章 通過異常處理錯誤


異常說明,使用throws關鍵字,表明方法可能拋出的異常類型。

方法代碼中產生了異常:要麼處理這個異常,要麼在異常說明中說明這個方法將產生異常。

可以聲明方法將拋出異常,實際上卻不拋出。

Throwable類:Error表示編譯時間和系統錯誤;Exception通常是程式員關注的基本類型。

在編譯時間被強制檢查的異常稱為被檢查的異常。從RuntimeException繼承的異常,可以在沒有異常說明的情況下被拋出,它們會自動被虛擬機器拋出,也被稱為不受檢查異常。

當要把除記憶體以外的資源恢複到它們的初始狀態時,就要用到finally子句。

當覆蓋方法的時候,只能拋出在基類方法異常說明裡列出的那些異常。


第十三章 字串


String對象是不可變的,具有唯讀特性。每一個看起來會修改String值的方法,實際上都是建立了全新的String對象。

Regex。


第十四章 類型資訊


通常,你希望大部分代碼儘可能少地瞭解對象的具體類型,而是只與對象家族中的一個通用表示打交道。所以多態是OOP的基本目標。

所有的類都是在對其第一次使用時,動態載入到JVM中的。當程式建立第一個對類的靜態成員引用時,就會載入這個類。因此Java程式在它開始運行之前並非被完全載入,其各個部分是在必須時才載入的,這一點與許多傳統語言不同。

一旦某個類的Class對象被載入記憶體,它就被用來建立這個類的所有對象。

Class.forName("Name");這個方法是Class類的一個static成員,返回的是一個Class對象的引用。

如果已經有一個感興趣的類型的對象,就可以通過getClass()方法來擷取Class引用。

類字面常量:ClassName.class;產生對Class對象的引用。

泛化的Class引用:建立一個Class引用,它被限定為某種類型,或該類型的任何子類型:
Class<? extends Number> b = int.class;

關鍵字instanceof,返回一個布爾值,告訴我們對象是不是某個類型的執行個體。

Class.isInstance()方法提供了動態地測試物件類型的途徑。

對RTTI來說,編譯器在編譯時間開啟和檢查.class檔案。而對於反射機制來說,.class檔案在編譯時間不可擷取,在運行時開啟和檢查.class檔案。

 

讀了前半本<Thinking in Java>

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.