《Thinking in Java》讀書筆記(不斷更新中)

概述

春節在家鄉,家裏的電腦都是我上大學時淘汰的,要麼運行不起來AS,要麼連接不上手機,要麼編譯不了程序,這Android是寫不了了。
記得前幾天寫插件的時候,用過Intellij IDEA,感覺很流暢,心說在我的小霸王電腦上試一試。於是我就下載了一個Intellij IDEA,運行Hello World暢快無比,OK,那麼這幾天有空就複習一下Java基礎知識吧,溫故而知新。
手頭正好有一個本《Thinking in Java》,不看不知道,一看還是有點嚇一跳,裏面有一些知識和細節還是我不知道的,於是總結一篇讀書筆記。(不斷更新中)

第2章 一切都是對象

1 類的成員變量若是基本數據類型,即使沒有初始化,Java也會確保它獲得一個默認值。

char:’\u000000’(null) boolean: false其他都是0,)
只有當變量作爲類的成員變量使用時,Java纔會確保給定其默認值。
上述原則不適用於 “局部”變量(即並非某個類的字段)
因此,如果在某個方法中定義有int x; 這個想得到的可能是任意值(和CC++中一樣),如果不賦初始值,java編譯器會報錯。


我的理解:堆區的會被自動默認值,棧區的不會。因爲數組裏的元素也是會賦予默認值。

2 方法名和參數列表(合起來成爲“方法簽名”)唯一標識出某個方法。

注:和返回值無關

第3章 操作符

1 Random類

在使用Random類的時候,如果構造時傳入相同數值,則後面的nextXXXX()得到的值每次都相同了。如果不傳入數值,默認是系統的當前時間作爲隨機數生成器的種子
但不管怎樣,多次調用nextXXX(),還是會生成不一樣的隨機數

2 一元加號 +

唯一的作用: 將 較小類型的操作數 提升爲 int

3 進制

大寫、小寫的L,代表long(使用小寫l容易造成混淆,因爲和數字1很像。)
大寫、小寫的F 代表float
大寫、小寫的D 達標double
前綴0x、0X帶包十六進制,後面跟隨0-9或大寫、小寫的a-f。

通過使用Integer、Long類的靜態方法 toBinaryString() 輸出二進制形式的結果。

4 指數計數法

e 代表10. 1.39 e-43 = 1.39 * 10 (-43次方)

5 按位操作符

異或 ^
~
布爾類型,沒有按位非 ~ 運算。大概是爲了避免與邏輯NOT 混淆。(邏輯只有 && || ! )
對於布爾類型,按位操作符 和 邏輯操作符 效果相同, 然而 沒有 “短路”

6 移位操作符,

只能操作整數。
<< 低位補0
>> 高位補符號位
>>> 高位補0
char、byte、short 在進行 移位處理時,會被自動轉換成int。得到的結果也是int。
所以對它們進行<<= >>= >>>= 這種運算,可能得到-1.

第4章 控制執行流程

1 逗號操作符

(注意,不是分割函數參數的逗號分隔符)
Java裏唯一用到逗號操作符的地方就是for循環的控制表達式。在初始化,和步進控制部分(1,3部分)使用,判斷部分不能用,只能是一個boolean的表達式。

2 switch

書中說只能是int或者char的整數值才能switch,實測String也可以。(java 7 引入)
Enum也可以( Java 5) ,
注意,long不可以。!!!!

3 臭名昭著的goto

Java裏沒有goto,雖然它是保留字,有一個類似的機制continuebreak,搭配標籤
標籤式後面跟有冒號的標識符。
在Java中,標籤起作用的唯一的地方剛好在迭代語句之前
在標籤和迭代之間置入任何語句都不好。
使用標籤的唯一理由:我們希望在嵌套循環迭代or開關。

4 continuebreak

continuebreak本身只能中斷最內層循環
一般的continue會繼續執行遞增表達式,continue + 標籤,不會執行遞增表達式

第5章 初始化與清理

1 類成員變量,定義時就被初始化構造器中初始化 的區別

初始化塊優先於構造方法被執行,如果初始化塊執行中,構造方法被調用之前沒有什麼特殊的處理,只是單純的成員變量賦值,那麼效果是一樣的。

對於靜態變量、靜態初始化塊、變量、初始化塊、構造器,它們的初始化順序以此是(靜態變量、靜態初始化塊)>(變量、初始化塊)>構造器。

並不是父類完全初始化完畢後才進行子類的初始化,實際上子類的靜態變量和靜態初始化塊的初始化是在父類的變量、初始化塊和構造器初始化之前就完成了。

  那麼對於靜態變量和靜態初始化塊之間、變量和初始化塊之間的先後順序又是怎樣呢?是否靜態變量總是先於靜態初始化塊,變量總是先於初始化塊就被初始化了呢?實際上這取決於它們在類中出現的先後順序

大家可以隨意改變變量a、變量b以及靜態初始化塊的前後位置,就會發現輸出結果隨着它們在類中出現的前後順序而改變,這就說明靜態變量和靜態初始化塊是依照他們在類中的定義順序進行初始化的。同樣,變量和初始化塊也遵循這個規律。
參考自:http://tieba.baidu.com/p/1586488031

靜態代碼塊跟靜態變量都是類加載時進行初始化的(同等條件下,初始化順序由書寫順序決定)
非靜態變量和非靜態代碼塊是在類實例時進行初始化的(同等條件下,初始化順序由書寫順序決定)
static final 修飾的變量,在類加載時已被初始化(一次),必須賦初始值。
final 修飾的變量,在每次創建新實例時被初始化(每次),必須賦初始值。

2 方法重載(涉及基本類型的重載)

基本類型能從一個較小的類型自動提升至較大的類型。因此當找不到最合適的方法,會自動向上轉型到最接近的。byte-short-int-long-float-double
char略有不同,會把char自動提升至int-long-float-double。

如果傳入較大的類型,則必須手動強轉,否則編譯報錯。

3 this關鍵字

調用方法是“發送消息給對象”。編譯器做了一些幕後工作,它暗自把“所操作對象的引用”作爲第一個參數傳遞給方法。
所以a.peel(1);-> Banana.peel(a,1);
這是內部的表示形式,我們寫代碼不能這麼寫。

通常this,表示 對當前對象的引用
但是如果在構造器中,爲this添加了參數列表,就表示調用其他構造器。
有三點注意事項:

  1. 只能用this調用一個構造器,不能調用2+個構造器
  2. 必須將構造器調用 置於 最初始處(第一行)
  3. 除了構造器之外,編譯器禁止在其他任何方法中調用構造器函數。

4 static 的含義

可以在沒有創建任何對象的前提下,僅僅通過類本身來調用static方法。這實際上正是static方法的主要用途。

5 finalize()

不等同於“析構”。 不建議用。 如果通過java調用其他代碼,例如C,C裏通過malloc()函數獲取的空間需要在finalize()裏釋放。

6 垃圾回收如何工作

Java虛擬機採用 自適應 垃圾回收技術。自適應的、分代的、停止-複製、標記-清掃 式 垃圾回收期。

7 可變參數列表

Java SE5,varargs, 0~n個參數本質仍是數組,foreach用的時候不用判空。

8 枚舉類型

Java SE5
enum 其實是.
ordinal()方法,表示特定enum常量的聲明順序
static values()方法,按照enum常量聲明順序,產生數組

第6章 訪問權限控制

1 訪問控制(隱藏具體實現)與“最初的實現並不恰當”有關。

讓客戶端程序員,不要觸碰那些他們不該觸碰的部分。
讓類庫設計者,可以更改類的內部實現。

2 每個編譯單元(.java)只能有一個public類,0+個protected類。

3 編譯時,每個類都會輸出一個.class,因爲編譯少量.java 會生成大量的.class

4 如果不提供任何訪問權限修飾詞,默認是“包訪問權限”。

5 protected處理的是繼承的概念

6 一個類的構造器是private的,將不能被繼承。

7 (具體實現的隱藏)把數據和方法包裝進類中,稱之封裝。

8 雖然不常用,但是編譯單元內完全不帶public類也是可以的。可以隨意命名文件。

9 類只能是public或者包訪問權限,(內部類可以是private和protected)

10

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章