如何理解:List<String> list=new ArrayList<String>();為甚麼要聲明為List 而不是ArrayList<String>?
在java中 使用面向接口編程 也就是面向抽象編程 這樣程序 可擴展性更好 降低耦合 ArrayList LinkedList 都是List 的子類 就像 Set 也是Collection 的子接口 它的實現 有 hashSet linkedHashSet TreeSet 等
工作中很多時候,我們需要把很多種類的實例對象,全部扔到一個集合,這個時候我們應該尋找到一個標准,接口就是一個標准。或者可以理解:把很多種類的子類實例對象全部扔到存放父類實例的集合。
向上轉型(聲明使用父類):子類對象會遺失 與父類不同的方法 ,還有 丟失的子類特有方法
向下轉型:可以調用子類那些特有的方法,重新獲得丟失的子類特有方法<泛型是常用>
第一種形式用當前類作為引用類型,那么可以訪問到ArrayList這個類中的所有公用方法。
第二種形式,用ArrayList實現的接口List作為引用類型,那么通過list引用可以訪問到接口中定義的方法。
也就是說ArrayList這個類實現了List接口,除了要必須實現接口List中聲明的方法外,還可以實現額外的一些方法。
但是,第二種形式就無法調用的List接口以外的方法。
使用上,設計模式中有:“代碼盡量依賴於抽象,不依賴於具體”。第一種形式就是依賴具體,第二種形式就是依賴於抽象。因為List是接口。代碼依賴於抽象的好處是,代碼可以方便替換。
例如:代碼List list = new ArrayList();下面通過list來操作集合。代碼編寫后發現集合使用的不准確,應該使用LinkedList,那么只要修改一行代碼List list = new LinkedList();就可以,這行以后的代碼不需要修改,因為List接口保證了調用的都是接口中的方法,而ArrayList與LinkedList都實現了List接口。而如果當時用ArrayList list = new ArrayList()這種形式的話,那么list訪問到的就可能是ArrayList里獨有的方法而非List接口中的方法。這樣替換成LinkedList的時候就有可能需要修改很多的代碼。