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