讀書筆記《Thinking in Java》-第一章-07/10/14
16、對于非面向對象的編程,它產生的函數調用會引起“前期綁定”。編譯器產生對一個具體函數名字的調用,而連接器將這個調用解析到將要被執行的代碼的絕對地址。相反地,在面向對象編程中采用了“后期綁定”,當對象發送消息時,被調用的代碼直到運行時才能被確定。為了執行后期綁定,Java采用一段特殊的代碼來替代絕對地址調用。這段代碼使用在對象中存儲的信息來計算方法體的地址。
(多態,或者說是向上轉型。他忽略了類型的具體細節,僅僅和基類交互。這很符合我們人類的思維習慣,比如你會開車,那么給你一輛奔馳你肯定能開,寶馬也可以。只需說我在開車,而不必說我在開奔馳開寶馬。當然你可以這么說,炫耀一下也不是錯^_^,Java允許你這么做。)
17、(繼承就是對接口的復用,既然我們只想復用接口,那么干脆就創建接口,用接口去操作具體對象。接口優于抽象類。)
18、Java對象是在堆中創建的,也就是動態的方式。這種動態的方式犧牲了效率,但是帶來極大的靈活性,這種靈活性正是解決一般化編程問題的要點所在。Java的垃圾回收機制,可以自動發現不會再被使用的對象,并繼而銷毀它。這種方式減少了需要考慮的議題和必要編寫的代碼。更重要的是垃圾回收器提供了更高層次的保障,可以避免暗藏的內存泄漏問題。(這個問題使得許多的C++項目折戟沉沙)。
19、容器是一種持有其他對象引用的新的對象類型,這些對象本身并不在容器中,僅僅是引用。容器有多種多樣的,因為需要是多種多樣的,所以根據需要在已知的容器中選用合適的容器類型就可以了。這些容器提供了相應的方法來處理其中引用的對象,如排序、查找、存入、取出等。
迭代器是一種選取容器中的元素,并把它呈現給用戶的對象。迭代器提供了一種抽象,把容器的細節從訪問容器的代碼中分離出來。容器通過迭代器被簡單地抽象成為一個序列。就是說,你可以遍歷整個序列,而不用擔心底層結構。
(這些容器就是很通用的數據結構和算法的有機集合。)
20、對容器的選擇:不同的容器提供了不同的接口和外部行為;不同的接口對于某些操作具有不同的效率。如:ArrayList和LinkedList具有相同的接口和外部行為。而ArrayList隨機訪問元素的時間是固定的開銷,LinkedList則是需要在列表中移動的,代價比較高昂,不適合做大量的隨機訪問。基類List和迭代器所帶來的抽象,把容器之間進行轉換時對代碼產生的影響降低到最小限度。
(所以,新建容器要這樣:List alist = new ArrayList();)
21、Java的單根繼承結構好處很多,這里就不羅嗦了。
22、除非確切地知道所要處理的對象的類型,否則向下轉型幾乎是不安全的。
(向上轉型就是把馬當作動物處理,馬具有動物的所有特性,所以是絕對安全的。向下轉型就是把動物當作馬處理,馬吃草是毫無爭議的,但是動物吃草就不行了,因為獅子老虎會不高興的:“俺可不是吃素的!”,危險就在這里。)
23、關于泛型:我看的是《Thinking in Java》第三版,使用的是j2se1.4,而此時j2se1.6都面世了。Java發展的非常迅速,早已經支持泛型了。此處的論述已經過時了,概不討論了……
24、異常處理。Java的異常處理機制是非常優秀的,異常不能被忽略,所以他保證一定會在某處得到處理。
(程序的健壯性是衡量程序質量的很重要的指標,不堪一擊的程序會出點錯誤就只能中止退出,可以回憶一下win98時代可怕的藍屏噩夢,看到藍屏是什么感覺呢?如果我很富有,一定會砸掉電腦,換上蘋果的。程序的健壯性如同人,要要經得起打擊,犯點錯誤是難免的,改正就是了,千萬不要自暴自棄,開除自己的地球球籍啊……)
25、并發性。多線程最常見的就是用戶界面。通常線程是一種為單一處理器分配時間的手段。如果機器有多個處理器,那么程序不需要特殊調整也能執行得更快。Java的線程機制是內置的。