一點一點看JDK源碼(〇)


一點一點看JDK源碼(〇)

liuyuhang原創,未經允許進制轉載

 

寫在前面:

幾乎所有的大神都會強調看源碼,也強調源碼的重要性;

但是如何看源碼,源碼看什么?看了什么用?看了怎么用?

困擾很多人,尤其是初學者。

 

本系列的目的在於看源碼,並非學習和總結源碼,先能夠粗略的瀏覽大量的原碼

並保證知曉有這么個東西,有個基本概念,再對其中的設計原理,優化方案進行學習

 

本文簡單的回答以下幾個問題:

1.為什么要看源碼?

2.什么時候或什么條件下看源碼?

3.看源碼看什么?

4.看源碼有什么用?

5.源碼看完了怎么用?

 

接下來以個人見解依次回答以上問題:

1.為什么要看源碼?

  究這個問題,很多人都認為軟件會用即可,寫代碼也是一種軟件應用,這個是本質!

  我們都站在巨人的肩膀上,過去是,現在是,將來也是,這個巨人,是歷史!

  在拿到每一個產品並使用的時候,我們需要仔細閱讀產品說明書:(從不看說明書的人左轉)

 

    ①了解產品的使用功能

    ②了解產品的安全性能

    ③了解產品的毒性和副作用

    ④了解產品的維護周期和生命周期

    ⑤了解產品的廠商與聲明

 

  對於不正確使用產品至死致殘又狀告商家的,就好像被人砍了要找賣刀的算賬一樣,

  只要超越了一般產品的正常使用方式,出現的問題沒人會代你負責的。(扯遠了)

 

  源碼就是編碼的說明書,因為我們在使用這個源碼。

  我們需要閱讀源碼,從說明書的角度去正確使用這些工具。

 

2.什么時候或什么條件下看源碼?

  本人只有java開發經驗,所以只能以java舉例進行說明了。

 

  • 如果java的基礎語法已經學習完了,能夠寫一些簡單的代碼了
  • 如果對於java的面向對象設計能夠依葫蘆畫瓢了,已經學完了jdk中的大部分工具了
  • 如果每天學習4小時以上,已經連續學習超過一個月了
  • 如果你很閑(不知道做什么)
  • 如果你很窮(還會寫點代碼)
  • 如果你想吃這口技術飯

  

  以上六條只要滿足三條以上,已經是應該適當看看源碼的時候了。

 

3.看源碼看什么?

  我們說萬物究其本源,要透過現象看本質,實際上這兩句話並不是完全正確的。

  萬物的本源應該是微觀粒子領域吧,事物的本質都是宇宙基本定律,也許還能更細究。

 

  假設我們要看java的原碼,那么又要考慮java是運行在jvm上的,應該看jvm原碼。

  同時jvm又是c++寫的,我們應該看c++原碼。

  同時c++運行在計算機底層是匯編,我們應該看匯編原碼。

  這哪里有完。

 

  所以,看java原碼,先看使用的工具集,即jdk就足夠了。

  一項一項向上系統的看才是正確的,至於其他的也並非不進行接觸,可能不是那么系統而已。

 

  而jdk看什么?

  打開API,好像隨便點一個類,都會有一個繼承(extends)的類,同時又實現(implements)很多接口

  難道一個一個向上看,看到最頂層,然后從頂層開始向下學習么?

  筆者也想過用這種方式,剛看了幾分鍾就覺得不對,原因如下:

  • java雖然是單根繼承體系,但是允許多接口實現;
  • java的設計根類是Object,但是根接口有很多;
  • java中很多類的設計是網狀的,並非一個單根樹結構;
  • java中很的接口可能又有很多子接口,孫子接口,光看接口,非常疲乏;

  所以,看java,要從一個常用的工具開始看,

  這個工具一定是一個具體的實現類,而並非抽象類,並非是接口。

  從一個點開始,向上開始展開。同時這個類最好不是jvm底層有運算符相關的

    (如String類的設計不建議最開始就看)

 

4.看源碼有什么用?

  這個問題看起來好像和為什么看源碼是一個意思,但是實際上要解釋的是不同的內涵。

 

  看源碼,主要是看源碼體現出的幾個問題,他分為兩個層次:

  4.1.源碼的構成模式

    構成模式,是指從一個類開始看,了解這個類的構成。一般包括:

      ①類的繼承體系

      ②類的實現體系

      ③類的成員變量

      ④類的構造器

      ⑤類的方法實現

 

    在看類的構造器和方法實現的時候,會發現有些類的構造器是使用了父類構造器,或

    加工了父類的構造器的。同理,類的方法實現,即時具體代碼看不懂,也要知道這個

    方法是做什么的,比如入參,出參,加工邏輯,是否是繼承,是否是父接口實現等。

 

  4.2.源碼的設計模式

    看源碼的繼承體系和實現體系的時候,肯定會有一種不知所然的感覺,

    “這個為啥要繼承?”“這個為啥要那么多接口?”

    當然,看的數量少,必定會有這種感覺。

    而源碼中的設計模式,實際上是妙不可言的,有些變量的命名,也是很走心的,

    有些沒有寫在doc中的雙斜杠注釋,才是真的應該關心,在API中看不到的內容。

 

5.源碼看完了怎么用?

  看源碼看jdk的原碼(自己說的,自己打臉),實際上對jdk進行改動的人少之又少,雖然開源。

  

  我們看源碼,看完了,明白了其中的良苦用心,難道我們在使用這些工具的時候能玩出花來么?

  也許根本做不到,美麗花朵夏天一場雨也許就掉光了。

  我們會不用jdk設計好的基類,而是在其基礎上進行擴展么?好像也不會。

 

  實際上jdk的設計模式,是我們開發模式的抽象集成。如:

    如何把控類的邊界?

    如何把控類的擴展性?

    如何提高類的可維護性?

    如何提高類的健壯性?

    如何進行代碼重構?

 

    難道架構師真的是個滿嘴跑火車號令群猿的人而已么?

    難道接口工程師只是命名寫注釋么?

    難道開發工程師拿到固定需求是隨便寫類的么?

 

  如果一個大型的研發體系中,沒有人懂源碼,沒有人懂架構,哦~呵呵~

  這必將影響這個研發項目產出產品的生命周期了。

  

  怎么用,取決於個人,看多深,也取決於個人,也許看到了一個新奇的代碼很是喜歡呢。

 

理論就說這些,之后將一個一個拆,對於源碼的體系,進行慢慢的剖析。

我也不知道會更多久,會不會更下去,堅持一點是一點吧。

 

6.已更列表:

 

一點一點看JDK源碼(一)Collection體系概覽

一點一點看JDK源碼(二)java.util.List

一點一點看JDK源碼(三)java.util.ArrayList 前偏

一點一點看JDK源碼(四)java.util.ArrayList 中篇

一點一點看JDK源碼(五)java.util.ArrayList 后篇之forEach

一點一點看JDK源碼(五)java.util.ArrayList 后篇之sort與Comparator

一點一點看JDK源碼(五)java.util.ArrayList 后篇之SubList

一點一點看JDK源碼(五)java.util.ArrayList 后篇之Spliterator

一點一點看JDK源碼(五)java.util.ArrayList 后篇之removeIf與Predicate

一點一點看JDK源碼(六)java.util.LinkedList前篇之鏈表概要

 算法是什么(二)手寫個鏈表(java)

 

 

以上!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM