&和|能夠用做條件語句,可是是長鏈接,左右兩邊的表達式必須都執行完!這和&&和||不一樣,&&和||是短鏈接,只要左邊的表達式已經可以計算出整個表達式的結果,右邊的表達式就不會執行!
java
繼承、重載、多態
程序員
重載和多態不是一個概念:
函數
重載:類內的、橫向的關係;兩個方法名稱相同,但參數不一樣,返回類型能夠不一樣(但不能只改變返回類型),存取權限能夠不一樣(由於重載的兩個方法之間沒有更多的關係,與繼承和多態無關)。
this
多態:類間(父類和子類)的、縱向的關係;繼承自父類的方法並覆蓋重寫,方法名稱相同,參數相同,返回類型相同或爲該返回類型的子類(且子類保證能執行父類的一切行爲),存取權限相同或更爲開放。
spa
關於返回類型和存取權限的不相同狀況,能夠從子類的聲明不能影響父類中聲明的使用方式這一角度來看,由於多態的目的就是使用父類做爲引用而不關心子類的實現,,因此子類的聲明不能使得父類中的聲明所體現的使用方式沒法使用。於是,返回類型子類不能超出父類的聲明,而存取權限子類不能限制父類的聲明。
線程
調用method:設計
編譯器根據引用類型來判斷哪些method能夠調用,而不是對象真正的類型。可是在調用哪一個版本時,是根據對象的真正類型尋找最近的版本。
code
爲何會容許建立Object對象?
orm
由於有時候就是須要建立一個通用的對象,一個輕量化的對象,最多見的是在線程的同步化中。
對象
super、this
每一個構造函數能夠選擇調用super()或this(),但不能同時調用,且它們必須是構造函數的第一條語句(父類構造函數是子類構造函數執行的第一步,父類必須先於子類構造)。
格式化說明:
格式化例子:%1$,06.1f
1$:使用第1個參數(計數是1基的,即格式化字符串後面的第一個參數)做爲浮點數進行格式化;
使用「,」分隔整數部分;
06:整數部分最少6個字符,不足部分用0補齊;
.1:小數點以後保留一位小數;
f:浮點數;
格式化中「<」表示重複利用以前用過的參數
java.util.Calendar:set(...)中的月份是零基的,因此0表示一月份,而且set是有延遲的。
try/catch是用來處理真正的異常,是程序員沒法預測或防止的執行期失敗情況,而不是程序的邏輯錯誤,而runtimeexception大部分都是程序的邏輯問題,屬於非檢查異常(unchecked,編譯器不檢查)。
設計原則:
面向對象設計:每一個類只要作好一件事情就好了。
因此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 <T extends SuperClass> void f(List<T> list) { list.get(0); // ok list.add((T) new ChildClass()); }