Java實用知識記錄 —— 截止到Java8

來源:互聯網
上載者:User

標籤:簡化   function   映射   核心   抽象方法   異常   推斷   緩衝   聲明   

記錄Java實用知識點,截止(包括)到Java8,只作概要的描述,不涉及到具體細節。

變數:
int、long的封裝類支援無符號位操作,即其在記憶體中的位可以用來全部表示正數。
“_”可以用來分隔數值(整形、浮點數皆可),且可以用在多種數值系統裡(二進位、十六進位等)。例:3.14_15F,0xCAFE_BABE。
如果一個常量(static final)是基本類型或字串字面量,編譯器會直接把常量替換成相應的值,對常量變更,則所有使用此常量的類需要重新編譯。
對靜態變數初始化時,可以使用靜態初始化塊,也可以在賦值運算式中直接引用靜態方法。例:static int i = staticMethod(); 執行個體變數同理,不過要注意執行個體方法被子類覆蓋問題(可以使用final方法)。

繼承:
方法重載屬於靜態多指派(既考慮靜態調用對象,又考慮方法參數),在編譯時間確定;方法重寫屬於動態單指派(只考慮實際調用對象),在運行時確定。
在源碼中方法簽名只由名稱和參數確定,在位元組碼中方法簽名還包括傳回型別、異常等等。
方法重寫的條件包括:子類有許可權訪問父類的方法,方法簽名相同,許可權、傳回型別、拋出異常相容。
執行個體中的靜態方法可以被繼承,但無法被覆蓋,屬於靜態指派。介面中的靜態方法無法被繼承。
多繼承時,類方法優先於介面預設方法;兩個介面繼承同一個介面中的方法,如果一個介面覆蓋了此方法,則此介面優先。

泛型:
泛型允許將類型當作參數使用。Java泛型通過擦除實現,僅在編譯期對泛型進行類型檢查。
參數化型別指有型別參數的泛型,原生類型指不帶泛型參數的泛型(非泛型型別不是原生類型)。
為了相容性,參數化型別和原生類型可以相互轉換,因此會破壞泛型的穩定性。例:List<String> sLi = new ArrayList<>();List rawLi = sLi;rawLi.add(1);
同一個泛型的不同參數化型別不能相互轉換,但使用萬用字元、邊界限定能改變此種行為。
在容器中,下界、無界萬用字元限定後除了null不能添加別的元素,上界萬用字元限定可以添加上界的子集元素。
可以使用輔助方法捕獲萬用字元的類型資訊,從而解除使用萬用字元的限制。如可以將List<?>的變數傳給接受List<T>作為參數的方法,捕獲萬用字元的類型。

內部類:
成員內部類通過外部類執行個體建立,Outer.Inner inner = out.new Inner(); 在內部類中可通過Outer.this(外部類類名.this)訪問外部類同名執行個體變數。
在內部類(局部類、匿名類)中使用外部類的局部變數(或方法參數)時必須為final或等效於final(因為局部變數與對象生命週期不同),使用外部類執行個體變數不受此限制。
非靜態內部類中不能有靜態成員、靜態代碼塊(常量除外)。
介面是固有靜態,不能在局部塊中定義。

Lambda:
Lambda運算式使用功能性介面簡化代碼的編寫,表現上比內部類更加簡潔。
遇到方法重載時,Lambda運算式使用參數、方法傳回型別等去推斷目標類型,從而決定調用哪個方法。
Lambda運算式使用詞法範圍,Lambda運算式本身不引入額外的範圍層次,也不繼承介面(目標類型)中的變數。在Lambda運算式中使用外部局部變數時,該變數也必須為final或等效於final。
詞法範圍範圍由在代碼中的位置決定,動態範圍範圍由運行時環境決定,大多數程式設計語言使用詞法範圍。
功能性介面(functional interface)指只包含一個抽象方法的介面,但介面中可以有多個預設方法或靜態方法。
Java8預定義了很多功能性介面,如Predicate<T>用來判定某個條件、Consumer<T>用來執行某個行為、Function<T,R>接受T類型的操作並返回R類型的值(T映射到R)。
Stream用來對數組、容器等進行流式操作,Stream中的方法接受功能性介面類型作為參數並返回Stream,所以能進行鏈式調用。

註解:
註解是一種特定的介面,用來對程式進行描述。註解本身只是一種中繼資料,但可以通過程式對被註解的程式進行處理。
類型註解(type annotation)可以用在任何使用類型(Type)的地方,包括變數聲明、構造執行個體(new 運算式)、轉型、繼承、異常拋出等。
類型註解可以用來增強Java的類型檢查,避免程式中潛在錯誤,如可以使用@NonNull來避免NullPointerException。
可重複註解可以在一個目標上被多次使用。由於相容性問題,可重複註解還需定義相應的容器註解才能使用(不知道註解裡面為什麼不能用泛型,不然容器註解就不需要重複定義)。
容器註解的目標(@Target)必須是可重複註解的目標的子集,否則不能通過編譯。

異常:
方法執行出錯時,拋出相應異常到方法調用棧幀,如果異常沒有得到處理,則沿調用棧一直傳遞,直至線程終結。異常不能跨線程捕獲。
受檢異常指程式能夠預期並應得到處理的異常,錯誤指程式外部不可預期的異常,運行時異常指程式內部由代碼問題造成的異常,應該避免。錯誤和運行時異常為非受檢異常。
異常總是被第一個匹配的catch塊捕獲,在一個catch塊中能捕獲多個異常,如catch(E1|E2 e),捕獲多個異常時,異常參數為隱式final類型。
try、catch中如果有傳回值,會先儲存傳回值(此處傳回值不是變數本身,而是變數所指向的具體值或對象引用),執行完finally塊再返回,如果finally有傳回值則會覆蓋try、catch中的傳回值。finally拋出的異常會壓制(suppress)try、catch中拋出的異常。
try-with-resources語句自動關閉(調用close方法)實現java.lang.AutoCloseable(java.io.Closeable為其子介面)的資源(resource),關閉順序與聲明順序相反,try塊中拋出的異常會壓制try-with-resources中關閉資源時拋出的異常。catch、finally塊在資源關閉後執行。
在異常對象上調用getSuppressed方法(Throwable中定義)可以擷取被壓制的異常。
方法中拋出的異常聲明可以為調用其它方法時所拋出的異常類型的所有可能被拋出的具體子類異常集合。

傳統I/O:
I/O(傳統I/O,非NIO)需要在應用程式(使用者態)和作業系統(核心態)之間切換。
緩衝通過減少程式與外部活動(磁碟、網路等)之間的切換次數,從而提高效能。
字元流是對位元組流的封裝,底層使用位元組流進行I/O操作,在此基礎上提供字元與位元組之間的轉換。

Java實用知識記錄 —— 截止到Java8

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.