對Java的瞭解還有待進一步提升,也沒有做太多實踐工作。只是把腦袋當成電腦,把Java放在裡邊不停地轉,觀察它的線路。得到的總體印象加上書本參考,認為Java的應用場景是慢和穩。
學程式語言總會接觸到c和彙編。從發展來看,最初的語言是用來配合計算機,根據計算機的硬體執行步驟程式設計出01。為了把01稍簡化些並且配合已知的常用功能造出了彙編,達到了可以簡單的閱讀。隨著使用量的增加,功能集合越來越多,“簡單的閱讀”滿足不了需求,繼續在它的基礎上產生c類的語言。讓計算機自己把c翻譯成彙編,再硬體性翻譯成01。這裡還是語言和機器溝通,只不過多了幾步軟體處理,通過計算機自己把c處理成它可以識別的01。也就是,給計算機c還是01,對計算機本身來說沒什麼區別,c,通過計算機自身翻譯,和01站在同一個對外承載切面上。
c比彙編好多了,隨著需求的增大又生出面相物件的語言,讓程式設計看上去更容易組織和被理解。發展到這裡都是為了迎合需求,用更容易讓人理解的方式開發語言。“程式語言”一直在做的事就是在人和計算機之間協調,工程量越來越大,怎樣保證人的低腦力輸出和計算機硬體的高效呼叫,便需要一個獨特的平衡協調。
面相物件語言都有自己的發展方向。Java的存在也有它獨特的思維體系,它更偏向於去妥協人的思考過程,也就是平衡偏向減少腦力輸出,同時增加運算量,降低了速度。
Java是動態編譯的語言。有很多語言都是“靜態編譯”,需要執行的01都被提前寫好在一個檔案裡,等到執行的時候直接載入這個檔案執行就可以了。像c就是這樣,執行起來是一個早就拼好的01串。動態編譯是用到什麼再臨時去拼湊,只有執行的時候才把程式拼出來並轉換成01。如果某一個檔案的所有功能一直沒有用到,那麼它就不會被翻譯成01。對計算機來說,在執行到相應任務之前,它並沒有辦法獲知具體需要做什麼。
Java在執行的過程中自行回收不再使用的記憶體。程式設計一般講究自己開的記憶體自己回收,這樣可以對記憶體應用有一個直觀的感應。隨著工程量增大,回收記憶體也佔用了大量的腦力,讓語言自己去回收就可以讓人輕鬆出來,有更多的腦力去投入到主題邏輯中。
想起來之前對get和set方法的提問,明明設定成可見屬性就能很方便使用,為什麼要設定成隱藏屬性,並且用這兩方法來操作。有人說為了封裝,有人說方便以後再獲取或者設定值的時候做一些前置或後置。想到記憶體上的話,一個是分配到棧,一個是分配到堆。這些思考使人更多去了解物件導向,瞭解物件和物件之間的相互協作。“把一件事交給另一個物件,你不需要知道它具體怎麼完成的,只要知道怎麼讓它執行這件事就好。”。(如果直接用屬性,你不但知道了怎麼呼叫它,還知道了它是怎麼完成的,這個物件不稱職。)在java裡,很容易感覺到這種相互配合。每一個物件不再是功能的抽象,聚合一個物件越來越偏向於從物件本身對它進行思考,埋合進自己的思維,讓物件顯得有思維。寫的程式碼是一個物件,而不是一個功能集合。它並不是把相關、類似的功能聚集在一起的檔案來方便功能的實現,它本身是一個物件,是一個物體,附有特殊的責任,在職責內的它能做,職責外的不能添給它。寫軟體不是功能和功能配合,是物件和物件配合。它區別於函式庫。語言裡邊的繼承使得它更適合融入人的思想。多型就像針對不同的環境做出不同的反應,本質上確是履行了同一種職責。介面就是你的存在在最開始就具有了一份通用功能,別人想用這份功能的話,都不需要知道你的名字就可以引用。軟體是一個物件相互協作的時空。
為了實現這種特別抽象出來的時空,java做了很多事去處理底層,這會變慢。計算機發展硬體總在不斷適應軟體需求,現在還是慢的狀況,以後卻是未知。