持續更新中
20200331
本人算是個Java初學者,知識儲備僅限于大學課堂上教過的C語言知識,而且也都忘的差不多了。Java基礎一直都很不牢靠,全是寫一點查一點。最基本的那些類型都不會用,也是沒誰了。。。
估計返校開學還有不到一個月左右的時間,這次買了本《Java編程思想第四版》好好補習一下。學到枚舉為止,窗體程序就先不看了,預計30天,每天25頁,每天晚上把所學整理到博客上,以便記錄和分享。希望自己利用好閑暇時間,打好基礎。
看到網上PDF版有很多,就自己轉了一個DOCX的放在CSDN了,自己轉的難免有錯誤,提前告知,還望海涵。但是在電子書上看方便多了
Java編程思想第四版DOCX
@[TOC]
第一章:對象導論
20200401
“”為對原文的完全引用,其他格式是自己對原書知識點的總結或啟發,如有錯誤之處還請前輩批評指正,感激不盡。
“我們之所以將自然界分解,組織成各種概念,并按其含義分類,主要是因為我們是整個口語交流社會共同遵守的協定的參與者,這個協定以語言的形式固定下來.....除非贊成這個協定中規定的有關語言信息的組織和分類,否則我們根本無法交談。--Benjamin Lee Whorf(1897-1941)”
"計算機革命起源于機器,因此,編程語言的產生也始于對機器的模仿。"
眾多表達形式(包括OOP),已經不像機器而更像我們頭腦的一部分,那么信息流的新形式或者新的理解將會是怎樣的呢? 想來AI未必會取代人類,很有可能會通過腦機接口與人結合,不過那個時候說不定人就不再是人了,會因接受新的特性而喪失現在的一些。想想感覺挺有趣的,會是什么呢?
1.1抽象過程
“所有編程語言都提供抽象機制。可以認為,人們所能夠解決的問題的復雜性直接取決于抽象的類型和質量?!?br>
“程序員必須建立起在機器模型(解空間)和實際待解決問題的模型(問題空間)”之間的關聯(映射)。”
假如可以自己產生關聯,而不需要建立映射豈不是很爽。。讓待解決問題與可能的解決方案自動關聯,也就自動解決了。。。想想就很棒
其實想想,學習語言(自然,機器)不過就是在學抽象機制,詞法:構詞單元的組成機制,詞與物的映射;音法:“元音”的組成機制,發音與詞的映射;語法:句的組成機制,句與意的對應(詞與詞的化學反應規則))。至于文法等其實就不屬于基本的語言學習了。所以看起來無論是自然語言還是抽象語言,其實學起來并不難,至少在理解其抽象機制上的負擔并不大,至于記憶(時間和訓練的成本)或許才是難點。。。。
“我們將問題空間中的元素及其在解空間中的表示稱為對象。但,你還需要一些無法類比為問題空間元素的對象”比如數據庫中表示關聯的表,在日常使用的過程中,想想還有什么。
Alan Kay 總結的Smalltalk的五個基本特性:
1.萬物皆為對象
2.程序是對象的集合,通過發送消息來告知彼此所要做的
3.每個對象都有自己的由其它對象所構成的存儲
4.每個對象都擁有其類型 :每個類最重要的區別于其他類的特性就是“可以發送什么樣的消息給他”
5.某一特定類型的所有對象都可以接收同樣的信息
“對象可以存在于不同的機器和地址空間中,它們還可以被存儲在硬盤上。在這些情況下,對象的標識就必須由內存地址之外的某些東西來確定了?!?/p>
1.2每個對象都有一個接口
UML(Unified Modeling Language,統一建模語言)形式的圖??梢匀W一下
1.4 被隱藏的具體實現
“類創建者創建的類只向客戶端程序員暴露必需的部分,而隱藏其他部分,這意味著類創建者可以任意修改被隱藏的部分”
access specifier:public,protected,private,默認是包訪問權限,包內public,包外private
1.5 復用具體實現
“代碼復用”
“1.直接使用該類的一個對象;2.將那個類的一個對象置于某個新類中,稱之為創建一個“成員對象”
“新類的成員對象通常都被聲明為private,使得使用新類的客戶端程序員不能訪問他們”
???運行時修改這些成員對象,動態修改程序????
“在建立新類時,應先考慮組合”
1.6 繼承
"對象這種觀念,使得你可以通過“概念”將數據和功能封裝到一起"
extends
“可以創建一個基類類型來表示系統中某些對象的核心概念,從基類型中導出其它類型,來表示此核心可以被實現的各種不同方式”
“以同樣的術語將解決方案轉換成問題是大有裨益的”
“所有可以發送給基類對象的消息同時也可以 發送給導出類對象,這也就意味著導出類與基類具有相同的類型”
“有兩種方法可以使基類與導出類產生差異:1.在導出類中添加新方法,但是應該考慮基類是不是也需要這種新添加的方法 2.Overriding,改變現有基類的方法行為,覆蓋”
“能夠 is-a 盡量不要 is like-a”
1.7 伴隨多態的可互換對象
方法操作的都是泛化generic的形狀,而不關心具體是什么形狀。完成代碼的統一表述,真爽
“這樣的代碼是不會受添加新類型影響的”
“一個非面向對象編程的編譯器產生的函數調用會引起所謂的前期綁定,然而在OOP中,程序直到運行時才能夠確定代碼的地址,所以為了處理泛化一類的,采用了后期綁定?!?br>
“為了執行后期綁定,Java使用了一小段特殊的代碼來替代絕對地址調用。這段代碼使用在對象中存儲的信息來計算方法的地址(???)”
“C++用virtual來實現動態綁定,但在Java中,動態綁定是默認的”
“與基類進行交互的代碼與具體的類型是分離的(decoupled)”
"把將導出類看作是它的基類的過程稱為向上轉型(upcasting)"
1.8 單根繼承機制
Object
“除C++外所有的OOP語言,都是單根繼承”
“共用接口”
“一切歸根到底都是相同的基本類型”
“不會因無法確定對象的類型而陷入僵局,對于系統級的操作(如異常處理)顯得尤其重要,并給編程帶來極大的靈活性”
1.9 容器:
“在任何需要時都可以擴充自己以容納你置于其中的所有東西。只需要創建一個容器對象。然后讓它處理i所有細節?!?/p>
不同的容器有不同的效率,學習的時候注意。
“向上轉型是安全的,但是向下轉型如果不確定具體類型,則很危險”
參數化類型 <>范型,非彼泛型,范型應是取規范類型之意
1.10 對象的創建和生命期
”每個對象為了生存都需要資源,尤其是內存“
對象的數據位于何處?怎樣控制生命周期?
“C++將對象置于堆棧或靜態存儲區內來實現。這種方式將存儲空間分配和釋放置于優先要考慮的位置”
“名為堆的內存池中動態的創建對象。這種方式中,直到運行時才知道需要多少對象,它們的生命周期如何,以及它們的具體類型是什么”
“動態方式有這樣一個一般性的邏輯假設:對象趨于變得復雜,所以查找和釋放資源存儲空間的開銷不會對對象的創建造成重大沖擊”
“垃圾回收機制可以避免暗藏的內存泄露問題”
“Java的垃圾回收機制被設計用來處理內存釋放的問題,但他不包括清理對象的其他方面”
1.11 異常處理:處理錯誤
“異常是一種對象,它從出錯地點被拋出,并被專門設計用來處理特定類型錯誤的相應的異常處理器“捕獲”。異常處理就像是與程序正常執行路徑并行的、在錯誤發生時執行的另一條路徑”
“異常不能被忽略,所以它保證一定會在耨處得到處理”
“異常處理時Java中唯一可接受的錯誤報告方式。如果沒有正確編寫正確的處理異常的代碼,那么就會得到一條編譯時的出錯信息”
1.12 并發編程
“最初,主進程的掛起是通過硬件中斷來觸發的,不能移植”
“彼此獨立運行的部分稱之為縣城”
“隱患:共享資源。如果有多個并行任務都要訪問同一項資源。某個任務鎖定某項資源,完成其任務,然后釋放資源鎖,使其他任務可以使用這項資源”
1.13 Java和Internet
1.13.1 Web是什么
1.客戶/服務器計算技術
C/S
系統具有一個中央信息存儲池(central repository of information),用來存儲某種數據,它通常存在于數據空中,你可以根據需要將它分發給某些人員或機器集群??蛻?服務器概念的關鍵在于信息存儲池的位置集中于中央
負載均衡
事務處理
任何小的延遲都會產生巨大的影響,為了將延遲最小化,減輕處理任務的負載,但有時也會使用所謂的中間件將負載分散給在服務器端的其他機器
物聯網的話,規定一套規則和一種文件格式,發生連接即發送,包含調用接口,說明,和授權。自動生成對應的控制界面。準么樣?我的意思是在設計所有能接入的設備時都這樣規范化,然后統一自動實現。有時間想寫個小程序試一下,就像是黑客 嗎,就是有控制的被黑,互相黑
2. Web其實就是一臺巨型服務器
“最初只有一個單向的過程,你對某個服務器產生一個請求,然后它返回給你一個文件,你的機器(客戶機)上的瀏覽器軟件根據本地機器的格式來解讀這個文件。”
“向前一大步,一段信息不經修改就可以在任意型號的計算機上顯示”
“瀏覽器并不具備顯著的交互性,而且它趨向于使服務器和Internet阻塞,為了解決這個問題,首先做了諸如圖形標準增強等方法,其余的由客戶端編程來解決”
1.13.2 客戶端編程
“服務器瀏覽器編程的交互性完全由服務器提供”
CGI(common gateway interface)通用網關接口?????
這部分好好看一下
1. 插件
這一部分可能有些已經過時,我也不清楚,沒有相關知識,但是???這里開始我還是應該回去看一看,做做功課,至少了解其思想
因為不理解,所有很多就不再摘錄了
2. 腳本語言
“HTML優點快速加載,易于理解,缺點代碼暴露給任何人去瀏覽或竊取”
“腳本提供了更容易更快捷的開發方式,在考慮復雜方案前,應先考慮腳本語言”
3. Java
4.備選方案
5. .NET和C#
6. Internet和Intranet
“Intranet”(企業內部網)
1.14 總結
“很多問題都可以通過重用現有的類庫代碼而得到解決”
要改變下自己的思維,學習時可以努力知其所以然,但是在工作過程中,應當樂于成為調包俠,這是Java的優勢所在,也可以大大提升效率,專注解決自己的問題。而很多時候,受限于我自身垃圾的水平和這個專業的特點,應當把學習分為工作性質的學習和深挖性質的學習。一旦明確自己在工作性的學習當中時,就一定要像構造函數一樣明確自己的輸入輸出是什么,從而明確自己的學習深度。知識的海洋浩瀚無邊,能夠探尋原理當然快樂,但是工作時沒有人該為你的快樂買單,有投入有需求就應該有產出,這是我極大的問題,必須改正,加油,奧里給!??!哈哈
所以看到這里的一起學習Java的同學們,如果也是要在工作中快速上手,那么我不建議你先看這本書,隨便找個JDK文檔或者什么速查的東西先去做就好了,我的這個博客也是拿出一些空余時間想來系統的學習整理一下,到時候感覺有價值的話回頭在整理也不遲。
“OOP和Java也許并不適合所有的人。重要的是要正確評估自己的需求,并決定Java是否能夠最好的滿足這些需求,還是使用其他編程系統(包括你當前正在使用的)才是最好的選擇。如果知道自己的需求在可預見的未來會變得非常特殊化,并且Java可能不滿足你的具體限制,那么就應該去考慮其他選擇?!?br> “即使仍舊選擇Java,至少也要理解還有那些選項可供選擇,并且為什么選擇這個方向要有清楚的認識”