Thinking in Java 學習筆記 四

內部類,簡單而言就是一種代碼隱藏機制:將類置於其他類的內部。具體的指明這個對象的類型:OuterClassName.InnerClassName。內部類對象在創建時就與外圍環境建立聯繫,可以無條件訪問外圍對象所有成員 。內部類對外圍類成員的訪問權是怎麼做到的?當外圍類創建內部類對象的時候,內部類對象必定會祕密捕獲一個指向外圍類的對象的引用。內部類是非static的,這個實現細節由編譯器來完成。.this對外圍對象引用,.new創建內部對象。Interface的方法默認設爲public。


對於聲明爲static的內部類,在引用的時候,創建內部類對象無需先創建外圍對象,而內部對象也不能引用外圍非static的成員。


對內部類最大的疑問就是爲什麼需要內部類,這項特性有什麼是其他特性解決不了的適應區域麼?內部類最吸引人的一點:可以獨立地繼承一個接口的實現,無論外圍類是否已經實現,對內部類都沒有影響。(作爲對一個多重繼承機制的補充,這項特性可以確保對一個接口的純粹實現,而不必擔心因多重繼承導致的混亂)


Java最惹人爭議的問題就是沒有類似指針的機制,這樣導致無法使用callback回調。
內部類對象中的閉包以及回調實現並不理解,希望留待以後驗證。


對於一種語言,如Java應該如同對待一款軟件系統一般來看待它:當你使用winxp的時候,你覺得很好很強大,win7你發現更好,有了更多的特性。但是對java你所使用的東西確一直停留在3、5年前的經典書籍的語法特性,Java SE5發了,6發了,7也要發了,這些個新的特性你會去用麼?


程序的複雜性,主要是程序不能預知會產生多少對象及其生命週期。對於對象的持有(因爲不能只是通過創建對每一個對象的命名來持有),java提供了一套使用容器(類似STL),名爲Collection,包含了基本類型List、Set、Queue、Map(Google Collection可以嘗試使用,有更大的驚喜)Set對每個值都只是保存一個對象,Map允許將某些對象與其他對象關聯起來的關聯數組,Java容器類都可以自動地調節自己的尺寸(這點與ArrayList類似,這個是最基本最可靠的容器了)
對於ArrayList而言,保存的都是Object類(java中多態的僞實現也是如此),所以你可以隨便將各個類型的對象add進去,如論編譯還是運行都沒有問題。所以在取出時(get)你得到的也只是Object的引用,必須將其轉爲需要的類型(強制轉型,不然使用時語法錯誤)。如果你將取得的A類對象強制轉爲B類對性,那就要悲劇。爲了防止這種現象,可以使用預定義的泛型,ArrayList<A>這樣的好處在於在編譯期就能防止錯誤類型放入 。


這就是一個編譯時錯誤與運行時錯誤,當然我們期望在編譯時就解決錯誤,而絕非是運行時。向上轉型也是允許的。
Java容器的作用爲保存對象。分爲兩類:
1) collection,服從一或多條規則的許留:List順序保存;Set不能有重複;Queue按照隊列來處理。
2) Map。一組成對的“鍵值對”對象,語序你使用鍵(key)來查找值(value)
儘管並非如此,你大部分編程實踐都在與這些接口打交道。這些都有擴展,如ArrayList至於List,HashMap、TreeMap之於Map等等。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章