《Java編程思想》讀書筆記

1 對象導論

  1. 面嚮對象語言的 5 個基本特性:萬物皆爲對象;程序是對象的集合,它們通過發送消息來告知彼此所做的;每個對象都有自己的由其他對象所構成的存儲;每個都擁有其類型;某一特定類型的所有對象都可以接收同樣的消息。簡言之,對象具有狀態、行爲和標識。
  2. 每個對象都提供服務,就是說在開發或理解程序設計時,將對象想象成“服務提供者”。這有助於提高對象的內聚性。注意:不要將過多的功能都塞在一個對象中。
  3. 在設計新類時,應該首先考慮組合,因爲它更加簡單靈活;如果優先使用繼承,可能導致難以使用並過分複雜的設計。
  4. 前期綁定、後期綁定、動態綁定。
  5. 在 Java 中,所有的類最終都繼承自單一的基類,即 Object,這就是 Java 的單根繼承結構。單根繼承結構的好處:保證所有對象都具有某些功能,使垃圾回收器的實現變得容易得多。
  6. Java 採用動態內存分配方式。

2 一切都是對象

  1. Java 存儲數據的 5 個地方:
    - 寄存器:這是最快的存儲區,它位於處理器內部;但是寄存器的數量有限,所以寄存器根據需求進行分配。你不能直接控制,也不能在程序中感覺到寄存器存在的任何跡象。
    - 堆棧:位於 RAM 中,但通過堆棧指針可以從處理器那裏獲得直接支持。堆棧指針若向下移動,則分配新的內存;若向上移動,則釋放那些內存。這是一種快速有效的分配存儲方法,僅次於寄存器。創建程序時,Java系統必須知道存儲在堆棧內所有項的生命週期,以便上下移動堆棧指針。這一約束限制了程序的靈活性。對象引用存在於堆棧中。
    - 堆:一種通用的內存池(也位於 RAM 區),用於存放所有的 Java 對象。堆不同於堆棧的好處是:編譯器不需要知道存儲的數據在堆裏存活多長時間。因此,在堆裏分配存儲有很大的靈活性。但是,用堆進行存儲分配和清理可能比用堆棧進行存儲分配需要更長的時間。
    - 常量存儲:常量值通常直接放在程序代碼內部。
    - 非 RAM 存儲:即使程序終止,它們仍然可以保持自己的狀態。
  2. 基本類型
基本類型 大小 最小值 最大值 包裝器類型
boolean —— —— —— Boolean
char 16-bit Unicode o Unicode 2^16 Character
byte 8-bit -128 +127 Byte
short 16-bit -2^15 +2^15-1 Short
int 32-bit -2^31 +2^31-1 Integer
long 64-bit -2^63 +2^63-1 Long
float 32-bit IEEE754 IEEE754 Float
double 64-bit IEEE754 IEEE754 Double
void —— —— —— Void
  1. static 關鍵字:static 作用於字段時,對每個類來說都只有一份存儲空間,但對於 static 作用於某個方法,差別卻沒那麼大。static 方法的一個重要用法就是在不創建任何對象的前提下可以調用它。

5 初始化和清理

  1. 用構造器確保初始化:java 在用戶操作對象之前自動調用相應的構造器,從而保證初始化的進行。注意,調用構造器是編譯器的責任。在 java 中,“初始化”和“創建”是捆綁在一起,不可分離的。
  2. 方法重載適用於構造器和其他方法。
  3. this 關鍵字:編譯器暗自把”所操作對象的引用”作爲第一個參數傳遞給方法,如 peel()。假設要在方法的內部獲取對當前對象的引用,是沒有標識符可用的,因爲這個引用是由編譯器“偷偷”傳入的。但是,爲此有個專門的關鍵字:this。this 關鍵字只能在方法內部使用,表示對“調用方法的那個對象”的引用。this 關鍵字可以用於將當前對象傳遞給其他方法。
  4. static 關鍵字:static 方法就是沒有 this 的方法。要是在代碼裏出現了大量的 static 方法,就該重新考慮自己的設計了。
  5. 初始化順序:在類的內部,變量定義的先後順序決定了初始化的順序。即使變量定義散佈於方法定義之間,它們仍會在任何方法(包括構造器)被調用前得到初始化。
  6. 靜態數據的初始化:static 關鍵字不能應用於局部變量,因此只能作用於域。靜態初始化只有在必要時刻纔會進行。如果不創建靜態成員所在類的對象,也不通過類名.的方式調用靜態成員,那麼靜態成員就永遠不會初始化。靜態對象不會再次被初始化。
  7. 初始化的順序是先靜態對象,再非靜態對象。
  8. 對象的創建過程
    a. 當首次創建類型爲 Dog 的對象時(構造器可以看作是靜態方法),或者 Dog 類的靜態方法/靜態域首次被訪問時,Java 解釋器必須查找類路徑,已定位 Dog.class 文件;
    b. 然後載入 Dog.class,這將會創建一個 Class 對象,有關靜態初始化的所有動作都會執行;
    c. 當用 new Dog() 創建對象的時候,首先在堆上爲 Dog 對象分配足夠的存儲空間;
    d. 這塊存儲空間會被清零,這就自動地將 Dog 對象中的所有基本數據類型設置爲默認值,而引用則被設置爲 null;
    e. 執行所有出現於字段定義處的初始化動作;
    f. 執行構造器。
  9. 實例化初始化子句是在構造器之前執行的。
  10. 數組中的基本數據類型會自動初始化成空值。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章