thinking in java學習筆記-第一章
這本書是由Bruce Eckel,這個人也許不熟悉,但是他的作品可是如雷貫耳啊,Bruce Eckel是MindView公司的總裁,這個公司提供一些軟體資訊和培訓。他是C++標準委員會擁有表決權的成員之一,擁有應用物理學學士和計算機工程碩士學位。Bruce Eckel從1984年至今,已經發表了超過150篇計算機技術文章,出版了6本書.他的《Thinking in C++》一本書在1995年被評為“最佳軟體開發圖書”,《Thinking in Java》被評為1999年Java World“最受讀者歡迎圖書”,並且贏得了編輯首選圖書獎。
第一章-物件導論
1.1抽象過程
主要介紹oop的由來,計算機來源於機器,作者認為程式語言都提供抽象的機制來解決問題,置於抽象出來的東西就是型別了。
抽象有兩種方式,一種是針對計算機內部的結構,比如早期的basic、c語言等,另一種就是針對問題本身,這種方式又衍生出了面向物件的方式。而且oop又和計算機有聯絡,作者把這種解決問題的物件看成是一個微型計算機,因為它有狀態又有操作,使用者可以讓物件執行這些操作。
java的前生語言smalltalk,有五個基本特徵:
1)萬物皆物件
為什麼這麼說呢?作者認為:你可以把一個需要解決的問題,任何具有概念化的東東,都可以定義為物件。
2)程式就是一組物件的集合,物件之間通過傳送訊息和接收訊息來相互通訊的
這個訊息是啥呢?就是我對一個物件的方法進行呼叫,就相當於我對他傳送了一個訊息。在現實中,就像我對你說了一句話(傳送訊息),我得先喊你的名字,明確是對你說的呀!
3)每個物件都是由其他物件構成的
原文中,對於這個解釋非常繞口,我就從我的角度說一下就行了,你也可以有其他的想法。作者的意思就是物件裡面套物件,因此可以建立無線複雜的物件,當然這只是理論上...
4)每個物件都有型別
這個相信大家都懂得,每個物件都是型別class的一個例項。有一點需要注意的是,類與類之間的區別就是“能夠傳送什麼樣的訊息給它”(謹記)。
5)某一型別的所有物件可以接受同樣的訊息
這裡有兩層意思,第一所有物件都是這個類生出來的,所以可以傳送相同的訊息;另一種情況就是父類-子類概念,比如圓形的物件同時也是一個幾何形,作者稱之為可替代性(substitutablity)。
最後booch更加簡潔的描述了物件:就是狀態、行為和標識,就是常說的屬性、方法和記憶體地址(或者名字)。
1.2每個物件都有一個介面
首先作者把我們偉大的哲學家亞里士多德搬出來了,這大哲學家太聰明瞭,早就看出型別(type)的概念了。敬佩!
作者認為,我們程式設計的過程就是建立新型別的過程,還有一點,程式都有內建的型別,比如浮點型,我們要面向實際問題中的型別,而不是計算機儲存的資料型別。
oop的設計思想就是在問題空間和解空間之間尋找物件的對映關係(這句話比較抽象)。通俗一點解釋:要解決問題,就是發生一系列的動作,而這些動作屬於某一個物件,比如燈泡這個型別,有開燈這個動作,而這些動作集合就是介面。
這個過程就是向某個物件發訊息,比如燈泡這個物件,我可以對他請求開燈、關燈操作。
最後說一下uml統一建模語言:
它是一個支援模型化和軟體系統開發的圖形化語言,為軟體開發的所有階段提供模型化和視覺化支援。UML規範用來描述建模的概念有,類(物件的)、物件、關聯、職責、行為、介面、用例、包、順序、協作,以及狀態。
1.3 每個物件都提供服務
如果要開發一個程式,就得把問題從表象抽取出來,什麼樣的物件能夠解決我的問題,因此將物件看作是服務提供者,有助於提高物件的內聚性。
1.4被隱藏的具體實現
類建立者需要向程式設計師暴露必須的部分而隱藏其他的部分,需要隱藏的東西通常來說是一個物件脆弱的部分,容易被修改,並且這部分東西可以被類建立者隨意修改,而不會對其他造成影響。
還有重要的一點就是訪問控制,允許類內部可以隨意更改,而不會對累的使用造成影響,介面與實現相分離,訪問控制詞如下:
1.5複用具體實現
最簡單的複用就是一個類中的成員包含另一個類的物件,使用現有的類合成新的類就叫組合(composition),如果這種組合是動態的就叫聚合(aggregation),是has-a的關係,比如汽車擁有引擎,URL圖如下,
1.6繼承
繼承的UML圖用一個空心的三角形表示 。
使用繼承主要是使基類和匯出類產生差異,有兩種方法,
第一,直接在匯出類中新增新方法;
第二,覆蓋(overriding)
1.6.1“是一個”。與“像是一個”關係
要明白一個概念“替代原則”:匯出類覆蓋基類的方法,擁有完全相同的介面,匯出類物件可以完全替代基類物件,稱之為“純粹替代”。
1.7伴隨多型的可互換物件
這個小節說的很晦澀,大致意思就是,我們可以用匯出類物件直接替換基類物件,但是實際執行的方法到最後執行的時候才能確定,編譯期是不確定具體執行哪個物件的程式碼的。
將匯出類看成是基類成為“向上轉型”(upcasting),這是“多型”的一種。
1.8單根繼承結構
java所有的型別都繼承自Object這個類,因此所有物件可以擁有共同的介面,這樣操作起來就非常方便,比說垃圾回收器,在堆上建立物件。
1.9容器
下面這段話非常重要: 在解決某個問題時,不知道需要多少個物件,不知道物件存活多久,也不知道需要多少空間來儲存這些物件,因為只有在執行時才能知道這些。 好的解決方案就是建立一個容器,比如陣列,這個容器只有對所有物件的引用,為什麼要選擇不同的容器呢? 第一,不同的容器有不同的介面和行為; 第二,不同的容器有些操作有不同的效率;1.9.1引數化型別
背景就是向下轉型和執行時檢查都是效率低下的,因為java1.5之前,所有的容器接受的物件都是object類,當從容器中取出某個物件時,就丟失了原來的型別資訊,所以需要強制向下轉型。 因此需要引數化型別這種機制。1.10物件的建立和生命期
java中物件是在堆上動態建立的,佔用空間以及存活週期在編譯期一無所知,只有在執行時才能卻定; c++中,物件是在堆疊上手動建立的,佔用空間以及存活週期在編譯期就可以確定。1.11異常處理:處理錯誤
異常也是一種物件,它在出錯點就被丟擲來,並被處理器所捕獲,異常不會被忽略,因此一定會被處理。1.12併發程式設計
執行緒的併發,以及鎖1.13java與internet
1.13.1web是什麼
1.客戶/伺服器技術 伺服器提供資訊,客戶機消費資訊 2.web就是一臺巨型伺服器1.13.2客戶端程式設計
這裡提到一個概念CGI通用閘道器介面(common gateway interface),伺服器產生靜態頁面,瀏覽器進行解釋,提交按鈕,通過cgi來進行處理。cgi程式的響應時間依賴於傳送的資料量、伺服器和網路負載。 客戶端提交頁面,cgi處理完,如果有錯誤,會返回錯誤頁面重新填寫,這個過程不太優雅。 因此我們可以讓瀏覽器做一些事情,因為執行瀏覽器的機器資源大部分會閒置,所以進行“客戶端程式設計”(實際上就是在瀏覽器平臺上編寫程式) 1.外掛 程式設計師下載一段程式碼,插入到瀏覽器,新增一些新的功能,因此他為專家級的程式設計師提供了一個“後門”,可以開發某種語言的擴充套件程式。 2.指令碼語言 指令碼語言可以直接嵌入到html頁面中,還得需要能夠解釋這種指令碼語言的外掛,伺服器收到請求時,可以被快速載入,但是缺點是任何人都可以看到指令碼語言,不安全。 指令碼語言更多的是用來建立更具互動性的頁面 3.java 通過applet執行在客戶端的小程式,作為網頁的一部分自動下載,因此在提交表單之前,就可以對日期型別進行校驗,從而不用傳送到伺服器,減少網路流量和伺服器負載。 applet沒有得到普及的根本原因在於,applet需要的java執行環境,所必須的10M頻寬過於恐怖。 4.備選方案 flash 5..NET和C# .NET類似於JRE執行環境,C#相當於java,activeX相當於applet.NET只能執行在windows平臺,並不是跨平臺 6.internet和intranet