Thinking in Java 讀書總結(一)

前言

以前有零散地閱讀過TIJ,可是都是針對本身的問題去有針對性的閱讀,沒有從頭梳理過Java的一些基礎知識。從前段時間開始本身也開始了總體性地學習TIJ的過程,也從這篇博客開始把本身的一些感悟和理解總結起來,也但願能對你們和我本身都有些幫助。html

第二章 一切都是對象

第一章大體都是一些面嚮對象語言或針對JAVA的特性的一些介紹,在後面的每一章中都有詳細的介紹,因此從讀書總結從第二張開始。java

2.1 用引用操做對象

  • 對於Java對象,操做的標識符都是引用,且引用可脫離對象單獨存在。
  • 若是向未指向對象的引用發送消息,那麼會返回一個運行時錯誤 -->動態綁定機制。

2.2 對象存儲

2.2.1 JVM的存儲分區

對於這一塊,JVM的內存模型是必需要清楚的內容,這個博客對於JVM內存模型的介紹很是全面,能夠參考學習。 簡略的說,內存能夠分爲虛擬機棧,本地方法棧,程序計數器,堆,方法區(包含運行時常量池)等部分。學習

2.2.2 基本類型

Java在任何平臺上每種基本類型所佔空間的大小都一致,這也是Java跨平臺特性的緣由之一。 編碼

參考2.2.1中可知,java基本類型不存儲在堆中,而基本類型對飲的包裝類的實例對象存儲在堆中,java提供了自動包裝機制來處理基本類型和實例對象的轉換問題。spa

特別的是:基本類型的包裝類和String類都是final的,不可變,因此每次操做都會生成一個新的對象,看起來和基本類型的傳值操做很類似。 且String類在初始化時JVM針對其初始化的方式的不一樣會有不一樣的處理,後面專門講解String的章節會詳細介紹。code

2.3 對象做用域

java中主要是用花括號來控制做用範圍。 基本類型的做用域:htm

{
  int x = 12;
  /* only x available */
  {
    int q = 96;
    /* both x & q available */
  }
  /* only x available */
  /* q 「out of scope」 */
}

而下面的方式是不容許的,在C++中是能夠的,但在Java中是不被容許的。對象

{
  int x = 12;
  {
    int x = 96; /* illegal */
  }
}

對象的做用域: new的對象能夠存活在做用域以外,只要有引用一直指向它,那麼對象就不會消失,但在範圍外引用會失效。blog

2.4 類

2.4.1 成員變量初始化

類的成員變量在實例化時會自動初始化,在沒有指定的狀況下,基本類型會初始化成爲默認值,類對象會設置成爲null。繼承

  • <table> <tr> <td>類型 </td> <td>值</td> </tr> <tr> <td>Boolean </td> <td>false</td> </tr> <tr> <td>Boolean </td> <td>false</td> </tr> <tr> <td>char </td> <td>false</td> </tr> <tr> <td>Boolean </td> <td>'\u0000'(null)</td> </tr> <tr> <td>byte </td> <td>(byte)0</td> </tr>

<tr> <td>short </td> <td>(short)0</td> </tr> <tr> <td>int</td> <td>0</td> </tr> <tr> <td>long</td> <td>0L</td> </tr> <tr> <td>float</td> <td>0F</td> </tr> <tr> <td>double</td> <td>0D</td> </tr> </table> 可是局部變量不會設置默認初始值!須要本身初始化,若是忘記了,那麼在編譯時會範圍錯誤。

p.s. 這裏初始化的問題在後面類的初始化和加載的時候會詳細討論,涉及繼承,多態等狀況時,初始化會變得較爲複雜。

2.8 註釋和嵌入式文檔

在註釋內按照標準的格式輸入,能夠利用JavaDoc提取文檔。 獨立文檔標籤是一些@開頭的命令。

  1. @see引用其餘類,能夠和@author,@version一塊兒使用
  2. @docRoot產生到根目錄的相對路徑
  3. @link,@inheritDoc,@Param等等

2.9 編碼風格

  1. 駝峯風格,Java標準。
  2. java代碼通常都是擺放開,閉花括號的方式。

第三章 操做符

3.1

靜態導入:其實很好理解,和普通import的區別就在於靜態導入後使用對應類的靜態方法時不須要使用類名.靜態方法的方式,能夠直接使用方法名。但其實我我的認爲通常用import就能夠了,由於靜態方法多的時候,使用靜態import一旦出現重名的狀況很容易發生衝突。

3.7 equals和==

這是java裏使人很迷惑的部分,能夠參考17章的筆記~

3.8 邏輯操做符

  • 在java中,只有boolean值能夠做爲判斷語句的參數,和C語言不同能夠用0和其餘值的區別來判斷。
  • String + boolean,此時boolean也會被轉型成爲String。

3.10 按位操做符

  • 與&,或|,非~,異或^
  • Boolean能夠與,或,異或,可是不能夠按位非(非是0,1間切換)

3.11 移位操做符

  • 左移:左移位運算符(<<)能將運算符左邊的運算對象向左移動運算符右側指定的位數(在低位補0)。
  • 右移:有符號」右移位運算符(>>)則將運算符左邊的運算對象向右移動運算符右側指定的位數。「有符號」右移位運算符使用了「符號擴展」:若值爲正,則在高位插入0;若值爲負,則在高位插入1。Java也添加了一種「無符號」右移位運算符(>>>),它使用了「零擴展」:不管正負,都在高位插入0。這一運算符是C或C++沒有的。這一點很重要!

對char, byte, short類型的數值進行移位處理,在移位進行以前,會被轉換成int類型,而且最終也會獲得int。

類型轉換

  • 基本類型的類型轉換中,窄化轉換必需要強制類型轉換,可是擴輾轉換不須要顯示的類型轉換。

  • 布爾類型不支持類型轉換!

  • 截尾與舍入

    • 從高的基本類型轉爲低的時,會採用截尾操做
    • 若是想從float,double到int用舍入操做,那麼能夠用Math.round()。
    • Java中對int型進行任何操做時,都會容易出現溢出的狀況,必需要留意(Java不會提示你超過範圍了)。

第四章 控制執行流程

4.7 java goto

goto在C,C++中是不推薦使用的,在java中沒有goto關鍵字,java經過另外一種加了限定的方式實現了受控的goto。

label1:
    //外部循環
{
    //內部循環
    {
        //...
        break; //1
        //...
        continue; //2
        //...
        continue label1; //3
        //...
        break label1; //4
    }
}

上面僞代碼中若是執行到3處,那麼會跳轉到循環外label1處繼續進行迭代;

若是進行到4出那麼會跳轉到label1處,而且不會從新進入迭代。

總結

前三章相對來講都是很是基礎的內容,在以前的工做中基本都已經熟悉了。可是有幾點須要注意:

  1. JVM的內存模型和GC的過程,這個須要專門的學習,後面也會從新看一下深刻JVM的書籍,上學的時候看感受不怎麼能看得懂,如今值得從新學習一波。在平常工做中使用JAVA感受理解Java底層的工做原理真的會有很大的幫助;
  2. String類型在Java裏是一種很是特殊的類型,須要好好專門學習學習。
相關文章
相關標籤/搜索