儘量使每一個類或者成員不被外界訪問。提供儘量小的訪問級別。數組
final維持字段不可變性,字段要麼是基本類型的、要麼是指向不可變對象的引用。安全
若是final包含可變對象的引用,雖然引用不能被修改,可是引用對象的內部卻能夠被修改。app
注意:長度非0的數組老是可變的。框架
講了不可變類的相關內容。函數
不可變類:實例不能被修改的類。實例化後,實例中包含的內部信息在整個生命週期中固定不變。工具
如何使類不可變ui
1)不提供任何修改對象狀態的方法spa
2)保證類不會被擴展。如將類聲明爲final線程
3)使全部的域都是final的設計
4)全部的域都是私有的
5)對任何可變域(指指向可變對象的域),使用保護性拷貝技術
不可變對象的好處:線程安全,能夠自由共享
不可變類的惟一缺點:每一個不一樣的值都要有一個單獨的對象,好比String s = 」aaa", String s2 = "bbb"。
因不可變類的缺點,能夠提供一個可變配套類,好比對String來講有StringBuilder
這裏的繼承指的是一個類擴展另外一個類的時候,不含接口繼承(類實現接口、接口實現接口)。
只有當兩個類A和B,二者之間確實存在is a關係的時候,才適合用繼承。問本身:每一個B都是A嗎?
若是某個類是爲繼承而設計的,在類文檔中應該明確描述覆蓋每一個方法所帶來的影響。
接口和抽象類區別
1)抽象類容許包含某些方法的實現,接口不容許。
2)實現抽象類,類必須成爲抽象類的子類。可是,任何一個類都可實現一個接口,無論這個類位於類繼承層次的哪一個位置。
接口的好處:
1)現有類很容易經過實現新的接口,實現新的功能,無論這個類位於類繼承層次的哪一個位置。
2)接口是定義mixin類型的理想原則。
mixin類型:指類除了實現它的基本功能外,還能夠實現mixin類型,以代表它提供了某種可供選擇的功能。
舉例:Comparable是mixin接口,某個類實現後表明具有排序功能。
3)類容許咱們構造非層次接口的類型框架。
舉例:singer接口表明歌唱家,songwriter接口表明做曲家,咱們徹底能夠聲明一個SingerSongwriter接口擴展上面兩個接口,表明同時歌唱家也是做曲家。
接口不容許含方法的實現。可是可提供個抽象的骨架實現類。接口用於定義類型,可是骨架實現類用於接口接口實現相關工做。
舉例:集合框架中的AbstractCollection、AbstractSet等都是骨架實現類。
講了不要使用常量接口。常量接口相似於下面。
public interface XXXXContants { static final double XXXXXX = 1.1222; static final double YYYYYY = 1.3222; }
常量接口的壞處:在版本迭代時,某個類再也不使用這些常量了,仍必須實現這個接口,以確保二進制兼容性。
如何定義常量。
1)常量與某個類或接口緊密相關,定義在這個類後接口中。
舉例:Integer中的常量MIN_VALUE
2)使用枚舉類型
3)使用常量工具類。
Java中沒有函數指針,可是能夠用對象引用實現一樣的功能,這樣的實例稱爲函數對象,舉例:Comparator類定義了排序策略。
講了嵌套類,主要是各類內部類的使用場景。
嵌套類有4種:
1)內部類:靜態內部類、非靜態內部類、匿名內部類
2)局部類
靜態內部類常見用法是用做輔助類。舉例:Calculator內部聲明一個靜態枚舉類Operation用於表示計算器支持的各類操做。Calculator.Operation.PLUS,Calculator.Operation.MINUS。
私有靜態內部類的常見用法是用來表明外部類所表明的對象的組件。舉例:Map的Entry。
非靜態內部類的常見用法是定義一個Adapter。舉例:Map接口使用非靜態內部類來實現集合視圖(collection view),如keySet、entrySet等。
靜態內部類和非靜態內部類的區別
1)靜態內部類可看作是普通的類,只是碰巧聲明在另外一個類的內部。能夠脫離外部類的實例獨立存在。
2)非靜態內部類的每一個實例都與外部類的一個實例向關聯,當非靜態內部類被建立時,這種聯繫創建起來。
匿名內部類常見用法
1)建立函數對象。舉例:排序時,建立匿名Comparator實例,傳遞給sort方法。
2)建立過程對象。舉例:Runnable、Thread
在任何可聲明局部變量的地方,均可聲明局部類。