Head First Java

來源:互聯網
上載者:User

標籤:

條件陳述式

&和|可以用作條件陳述式,但是是長串連,左右兩邊的運算式必須都執行完!這和&&和||不同,&&和||是短串連,只要左邊的運算式已經能夠計算出整個運算式的結果,右邊的運算式就不會執行!

繼承、重載、多態

重載和多態不是一個概念:

  • 重載:類內的、橫向的關係;兩個方法名稱相同,但參數不同,傳回型別可以不同(但不能只改變傳回型別),存取許可權可以不同(因為重載的兩個方法之間沒有更多的關係,與繼承和多態無關)。

  • 多態:類間(父類和子類)的、縱向的關係;繼承自父類的方法並覆蓋重寫,方法名稱相同,參數相同,傳回型別相同或為該傳回型別的子類(且子類保證能執行父類的一切行為),存取許可權相同或更為開放。

  • 關於傳回型別和存取許可權的不相同情況,可以從子類的聲明不能影響父類中聲明的使用方式這一角度來看,因為多態的目的就是使用父類作為引用而不關心子類的實現,,所以子類的聲明不能使得父類中的聲明所體現的使用方式無法使用。因而,傳回型別子類不能超出父類的聲明,而存取許可權子類不能限制父類的聲明。

調用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 <T extends SuperClass> void f(List<T> list) {    list.get(0); // ok    list.add((T) new ChildClass());}


Head First 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.