一點一點看JDK源碼(〇)

一點一點看JDK源碼(〇)html

liuyuhang原創,未經容許進制轉載java

 

寫在前面:c++

幾乎全部的大神都會強調看源碼,也強調源碼的重要性;算法

可是如何看源碼,源碼看什麼?看了什麼用?看了怎麼用?設計模式

困擾不少人,尤爲是初學者。安全

 

本系列的目的在於看源碼,並不是學習和總結源碼,先可以粗略的瀏覽大量的原碼架構

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

 

本文簡單的回答如下幾個問題:工具

1.爲何要看源碼?post

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)

 

 

以上!

相關文章
相關標籤/搜索