head first java原文_Head First Java
條件語句
&和|可以用作條件語句,但是是長連接,左右兩邊的表達(dá)式必須都執(zhí)行完!這和&&和||不同,&&和||是短連接,只要左邊的表達(dá)式已經(jīng)能夠計算出整個表達(dá)式的結(jié)果,右邊的表達(dá)式就不會執(zhí)行!
繼承、重載、多態(tài)
重載和多態(tài)不是一個概念:
重載:類內(nèi)的、橫向的關(guān)系;兩個方法名稱相同,但參數(shù)不同,返回類型可以不同(但不能只改變返回類型),存取權(quán)限可以不同(因為重載的兩個方法之間沒有更多的關(guān)系,與繼承和多態(tài)無關(guān))。
多態(tài):類間(父類和子類)的、縱向的關(guān)系;繼承自父類的方法并覆蓋重寫,方法名稱相同,參數(shù)相同,返回類型相同或為該返回類型的子類(且子類保證能執(zhí)行父類的一切行為),存取權(quán)限相同或更為開放。
關(guān)于返回類型和存取權(quán)限的不相同情況,可以從子類的聲明不能影響父類中聲明的使用方式這一角度來看,因為多態(tài)的目的就是使用父類作為引用而不關(guān)心子類的實現(xiàn),,所以子類的聲明不能使得父類中的聲明所體現(xiàn)的使用方式無法使用。因而,返回類型子類不能超出父類的聲明,而存取權(quán)限子類不能限制父類的聲明。
調(diào)用method:
編譯器根據(jù)引用類型來判斷哪些method可以調(diào)用,而不是對象真正的類型。但是在調(diào)用哪個版本時,是根據(jù)對象的真正類型尋找最近的版本。
為什么會允許創(chuàng)建Object對象?
因為有時候就是需要創(chuàng)建一個通用的對象,一個輕量化的對象,最常見的是在線程的同步化中。
super、this
每個構(gòu)造函數(shù)可以選擇調(diào)用super()或this(),但不能同時調(diào)用,且它們必須是構(gòu)造函數(shù)的第一條語句(父類構(gòu)造函數(shù)是子類構(gòu)造函數(shù)執(zhí)行的第一步,父類必須先于子類構(gòu)造)。
輸出格式化
普通格式化
格式化說明:
格式化例子:%1$,06.1f
1$:使用第1個參數(shù)(計數(shù)是1基的,即格式化字符串后面的第一個參數(shù))作為浮點數(shù)進行格式化;
使用“,”分隔整數(shù)部分;
06:整數(shù)部分最少6個字符,不足部分用0補齊;
.1:小數(shù)點之后保留一位小數(shù);
f:浮點數(shù);
日期格式化(String.format(...))
格式化中“<”表示重復(fù)利用之前用過的參數(shù)
日期類
java.util.Calendar:set(...)中的月份是零基的,所以0表示一月份,并且set是有延遲的。
異常
try/catch是用來處理真正的異常,是程序員無法預(yù)測或防止的執(zhí)行期失敗狀況,而不是程序的邏輯錯誤,而runtimeexception大部分都是程序的邏輯問題,屬于非檢查異常(unchecked,編譯器不檢查)。
輸入輸出
串流(InputStream/OutputStream)
設(shè)計原則:
面向?qū)ο笤O(shè)計:每個類只要做好一件事情就行了。
所以java的輸入/輸出API帶有連接類型的串流,代表來源與目的地之間的鏈接,連接串流將串流與其他串流連接起來。
一般來說,串流要兩兩連接才有意義——其中一個表示連接(輸入的來源或輸出的目的地),另一個表示要被調(diào)用方法(高層API,讀取出真正的高層次數(shù)據(jù)類型或輸出真正的高層次數(shù)據(jù))。
比如FileOutputStream用于想文件寫入字節(jié),但我們通常并不直接寫字節(jié),而是以對象層次的觀點來寫入,所以需要高層次的連接串流處理高層次的對象數(shù)據(jù)到字節(jié)流的連接。
于是這樣就可以通過不同的組合來達(dá)到最大的適應(yīng)性,而不必在一種串流類中考慮所有可能的情況(這是不可能的)。
序列化
標(biāo)記接口:
Serializable接口又被成為marker或tag類的標(biāo)記用接口,所有需要被序列化的類都需要聲明實現(xiàn)該接口,而實際上沒有任何方法需要被實現(xiàn),只是用來標(biāo)記,告訴JVM這個類可以被序列化。
而一個類被序列化時,其內(nèi)部所有的成員變量也將被序列化,因此它的成員變量也必須是能被序列化的,即實現(xiàn)了Serializable接口。
過濾:
如果某個成員變量不需要序列化,則使用關(guān)鍵字transient標(biāo)記一下,序列化將跳過這個變量。
指向不變性:
序列化會區(qū)分兩個變量指向的對象是否相同,如果序列化時兩個變量指向同一個對象,則反序列化時這兩個變量依然指向同一個對象。
父類與子類:
不可序列化的父類(非final)可以有可序列化子類,但是當(dāng)對象被反序列化時,父類的構(gòu)造函數(shù)將和創(chuàng)建新的對象一樣執(zhí)行(可序列化類的構(gòu)造函數(shù)不會被執(zhí)行),屬于該不可序列化父類及其祖先類的成員變量將被構(gòu)造函數(shù)初始化,但是被可序列化子類重載的成員變量將按照子類中的定義(是否transient)進行序列化和反序列化。
static:
靜態(tài)變量不會被序列化,反序列化后靜態(tài)變量會維持類中原本的樣子,而非存儲時的值。
序列化版本serialVersionUID:
在類中顯式地保存這個ID,則可以保證可序列化的類在演化后依然保持相同的ID,從而在經(jīng)歷了不損壞序列化的演化后該類依然能夠反序列化之前序列化的數(shù)據(jù)(新加的變量將使用默認(rèn)值)。
泛型
在方法參數(shù)中使用萬用字符?時,編譯器會阻止任何可能破壞引用參數(shù)所指集合的行為,即只讀不可寫:
class?ChildClass?extends?SuperClass?{
...
}
public?void?f(List?extends?SuperClass>?list)?{
list.get(0);?//?ok
list.add(new?ChildClass());?//?wrong
}
這樣倒是可以:
public??void?f(List?list)?{
list.get(0);?//?ok
list.add((T)?new?ChildClass());
}
總結(jié)
以上是生活随笔為你收集整理的head first java原文_Head First Java的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用 PS 调整服务器时间
- 下一篇: bit不是java基本类型吗_Java