一、自定義註解
@target 說明了Annotation所修飾的對象範圍: constructor、method、field、package、type等等。 @retention 定義了該Annotation被保留的時間長短, source(源文件保留)、class( class保留)、runtime(運行時有效)。 @inherited 某個被標記的類型是被繼承的。一個類標記了帶有@inherited的註解,那麼他的子類也擁有這個註解。 @document 被修飾的註解會生成到javadoc中。java
二、內部類
- 內部類分爲:成員內部類,匿名內部類,靜態內部類,局部內部類。
- 除了靜態內部類,其餘的內部類不能擁有靜態變量或靜態方法,由於內部類屬於外部類的一個成員變量,先加載外部類在加載內部類。 緣由:
- 靜態變量在類加載的時候須要將符號引用替換爲直接引用而此時尚未內部類的對象。
- 內部類沒法在沒有外部類的實例下直接使用。
2.一、爲何靜態內部類能夠擁有靜態常量
由於靜態常量是在編譯時期就肯定的值,會存入類的常量池,而訪問常量池中的常量是不須要加載類的。apache
2.二、內部類的使用場景
- 達到一個多重繼承的效果
- 訪問控制,只能經過外部類調用
三、自動拆箱裝箱
- 基本類型和引用類型之間的轉換。
- 集合類只接受對象。
- 注意包裝類的緩存值,Float和Double值沒有緩存值,Integer和Long緩存值爲-128~127超過以後會自動轉換成對象。兩個包裝類型進行比較時須要用equals。
四、String爲何是final,StringBuilder與StringBuffer的區別
- String定義成final類型表示不能被繼承,確保不會在子類中改變語義。 每次對string對象的改變至關於從新生成了一個新的string對象。常常改變的字符串不建議使用String。
- StringBuffer是線程安全的, StringBuilder是非線程安全的。
五、transient
- 被標記的成員變量不參與序列化過程。
- 只能修飾成員變量,不能修飾類和方法。
六、如何進行序列化
- 實現Serializable接口。
- 序列化使用輸出流進行writeObject。
- 反序列化使用輸入流進行readObject。
七、如何實現對象克隆
- 實現Cloneable接口,並重寫clone方法。
- 也可經過序列化方式進行深拷貝
- 通常實際使用過程當中咱們只須要拷貝對象的屬性,一般使用BeanUtils.copy() 這種拷貝都是淺拷貝
- 幾種拷貝對象的性能 cglib>Spring>apache, 通常不建議使用apache的由於對象轉換會出錯,Spring的date類型轉換也可能會出錯。
八、異常
8.一、Error
系統級別的錯誤,程序沒必要處理。出了錯誤以後只能退出運行。數組
8.二、Exception
- 須要進行捕捉或者程序處理的異常。
- Exception分爲運行時異常和受檢異常 RuntimeException包括:空指針異常,數組下標越界,classNotFound,類型轉換異常等等。 受檢異常指:編譯器要求方法必須聲明拋出可能發生的受檢異常。
九、Object中的finalize方法
若是類中重寫了finalize方法,當該類對象被回收時,finalize方法有可能會被觸發。緩存