今天具體看了下第八章和第十一章;第九章的接口很多東西還沒有搞明白,所以還是明天花時間搞定一下;下面是今天的知識:
第八章:多態(tài)
前幾章我發(fā)現(xiàn),繼承允許將對象作為對象本身和作為對象的基類來運行;在這種情況下,可以實現(xiàn)用一個基類作為函數(shù)的參數(shù),讓這個函數(shù)調(diào)用這個基類的各種子類;
而在這里,又要用動態(tài)綁定知識了,靜態(tài)綁定指的是在編譯器剛編譯時就綁定了的函數(shù),這種函數(shù)的參數(shù),運行結(jié)果早就已經(jīng)固定了,一般這種是static函數(shù)和final函數(shù);而動態(tài)綁定則是只有在運行時才知道具體要運行的代碼,根據(jù)傳入?yún)?shù)的類型來決定調(diào)用那些代碼;
多態(tài)就是這樣,根據(jù)作為參數(shù)傳入的基類引用綁定的具體子類對象的類型,判斷調(diào)用那個子類中具體的函數(shù);把子類對象用基類引用傳入函數(shù)中時,在函數(shù)中調(diào)用基類方法時,調(diào)用的是這個子類中已經(jīng)重寫過的方法;多態(tài)就是借用這個特性,用基類引用作為參數(shù),實現(xiàn)在不知道子類類型的情況下調(diào)用子類的代碼;
說起前面的向上轉(zhuǎn)型,基類和子類的關(guān)系就是一種子類包含基類的關(guān)系,子類》=基類;所以向上轉(zhuǎn)型就是指去掉子類中那些和基類不重疊的地方,把子類當(dāng)做一個方法一樣的基類來使用,相對于來說是減小了子類的范圍域;
說到向上轉(zhuǎn)型就有向下轉(zhuǎn)型,這里指的是對那些已經(jīng)作為基類引用的子類對象,對這個基類引用進(jìn)行子類引用的強(qiáng)轉(zhuǎn)型,這里編譯器會自動判斷是否轉(zhuǎn)型成功;轉(zhuǎn)型成功后還可以調(diào)用那些擴(kuò)展的方法;類似于下面的代碼;

上面moreuseful對象綁定在useful引用上,下面又對useful引用進(jìn)行擴(kuò)展的強(qiáng)轉(zhuǎn)型;這里編譯器沒有報錯,說明這種方法是可行的;
基類被復(fù)寫的方法之間是相互獨立的;在子類的構(gòu)造器中,最好不要用被復(fù)寫的方法,這樣的話在初始化子類時,父類構(gòu)造器被調(diào)用,這個時候父類中的這個方法也會用到多態(tài)屬性,調(diào)用子類已經(jīng)復(fù)寫過的方法;所以一般用簡單的語句來編寫構(gòu)造方法;盡量不要在構(gòu)造器中調(diào)用被復(fù)寫的方法;
第十一章:持有對象(容器)
容器指的是存儲數(shù)據(jù)的對象,這個和數(shù)組不同,容器可以根據(jù)數(shù)據(jù)的大小自動的生成對應(yīng)的空間;而容器可以存儲入任何對象;為了防止一個容器存入多種對象,用泛型來標(biāo)記存入對象的類型;容器也是對象;
泛型的語法:collection<Shape> s = new collection <.Shape > ();Shape代表存入其中的對象;
容器的父類為collection;其余的容器都是collection的子類;
容器分成兩大類:1.獨立元素隊列,像是一維序列;List,ArrayList,LinkedList,set,Hashset……等很多類型,其中每個類型有自己的長處和短處; ? ?2.map類型,由鍵-值對組成的隊列,其中鍵是不能重復(fù)的,值可以由任何對象組成,主要是一個相對的關(guān)系;
下面就先解釋collection:
往collection中插入數(shù)據(jù):1.add方法;2.collections.addAll(collection,array);3.arrays.asList(Array);返回一個list<T>對象;4.collecition.addAll( collection <T> s);用collection對象作為參數(shù)來初始化;上面四種方法,其中先創(chuàng)建一個空collection,再用2,3兩種方法添加則是最快的;(有一點:arrays.asList返回的對象本質(zhì)上是數(shù)組,所有在進(jìn)行增刪操作時會提示不能被resize)
容器打印直接調(diào)用print打印即可;
迭代器:iterator對象;每一個collection中都有iterator()方法,返回的是一個iterator對象;該對象內(nèi)有hasNext方法,next,nextIndex方法;可以用foreach來循環(huán)輸出所有的數(shù)據(jù);我個人感覺,內(nèi)部是有一個變量next,初始化為o,nextIndex方法返回這個變量,調(diào)用next方法時返回該下標(biāo)的對象,然后next++;remove方法除去的對象的下標(biāo)是這個變量-1;至于在list中的ListIterator中的previous方法返回的是下標(biāo)為變量-1的對象;
下面介紹容器的子類:
1.List<T>:這個list的是基于collection的容器,它分為ArrayList和LinkedList;內(nèi)部的迭代器就是上文的listIterator;它相對于collection添加了一些方法,方法和功能如下:

上面的方法中,前兩個contains是判斷該list中是否存在對象,1的參數(shù)為對象引用,2的參數(shù)為對象數(shù)組;3根據(jù)引用去除list中的對象;4用引用找出在list中的下標(biāo);5.equals方法和1一樣;6.sublist方法是把list中的數(shù)據(jù)根據(jù)下標(biāo)ab取出來返回一個對象數(shù)組,【a,b);7.isEmpty判斷是否為空;8.toAtrray則將list變成數(shù)組;
在list中分成ArrayList和LinkedList,就好像數(shù)組和鏈表的區(qū)別,arrayList傾向于隨機(jī)讀取數(shù)據(jù),LinkedList則傾向于增刪數(shù)據(jù);各有各的擅長部分;下面是LinkedList的幾個方法;
linkedList本質(zhì)上是一個雙向鏈表;內(nèi)部有addFirst();addLast;getFirst;getLast;removeFirst;removeLast;另外,1,remove和poll方法去除首端對象并返回;2.peek和element返回首端對象但不去除;3.offer和add在尾端添加對象;
這些函數(shù)也為LinkedList添加了擴(kuò)展的機(jī)會。Stack(棧LIFO)Queue(隊列FIFO)都是由LinkedList衍生而來的;尤其是Queue,新添加的幾個方法都是為Queue而存在的;
2.set:說完了list,說set,set是一個不不保存重復(fù)對象的容器,它的作用主要是用來測試歸屬性,即該對象是否存在于本容器中;set用contains來測試歸屬性;用add來添加對象;用remove來清除對象;
set的分類:1.Hashset:高速存儲和查驗;2.TreeSet:按順序排布數(shù)據(jù);3,linkedHashSet:按照存儲的順序排布且具有高速存儲查驗的set;
3.map:主要是鍵值對;對應(yīng)python中的dict;1.put添加數(shù)據(jù),2.keySet()返回鍵的set對象;3.values()返回值的collection對象;4.get(鍵)查找值;5.用remove(鍵)刪除鍵值對;
foreach可以用于任意的collection,因為在collection內(nèi)部有iterator類;這個代表foreach可以對iterator類進(jìn)行便歷;只要對象中有這種類型的方法,它就可以通過iterator類來遍歷容器中所有的對象;
上面就是今天的知識,以后有時間再修改補(bǔ)充;