《JAVA編程思想》閱讀筆記 第5章 初始化與清理

構造方法沒有返回值,與 void 類型不同,void 方法自身不會返回什麼,但仍可以選擇讓其返回別的東西。構造方法能在方法體內部調用其它的構造方法,但是不允許其它任何方法調用構造方法。

方法的重載基於參數列表的不同,即使是擁有相同的參數,參數的順序不同也能達到重載的目的(會導致難以維護,最好不要使用該方式)。無法根據返回值進行重載,是因爲在調用方法而忽略其返回值的情況下,會令 java 無法判斷使用哪個方法。

對於基本類型的重載,如果傳入的實際數據小於參數列表中聲明的數據類型,會讓實際數據類型得以提升;如果傳入的實際數據大於參數列表中實際聲明的類型,則會讓實際數據類型下降。也就是說,傳入的數據會被轉化爲參數列表設定的數據類型(char 類型略有不同,如果無法完全匹配,則直接將其變爲 int 類型)。

對於創建了同一個類的多個對象的情況,如果這些對象都調用了同一個方法,爲了對調用的對象能進行明確的區分識別,編譯器會自動將“所操作對象的引用”作爲第一個參數傳遞給被調用的方法。如類Banana的兩個對象a,b,調用方法的語句:a.peel(1);b.peel(2);,實際編譯器的處理類似:Banana.peel(a,1);Banana.peel(b,2)(實際開發時不能按這種方式書寫)。而如果希望獲得對當前對象的引用,則使用 this 關鍵字。

this 關鍵字只能在方法內部使用,表示對“調用方法的那個對象”的引用。在方法內調用同一個類下的其它方法時,可以直接調用而不添加 this 前綴,因爲編譯器會自動添加 this 關鍵字。只有在需要明確指出對當前對象的引用時,才需要手動添加。

static 方法中不能調用非靜態方法,但是非靜態方法可以調用靜態方法。static 方法的主要用途是通過類本身調用,以訪問其它靜態方法和靜態域。

雖然 java 針對對象的回收處理有垃圾回收機制,但是這種機制只能針對由 new 關鍵字創建出的對象,對於通過其它方式獲得內存空間的對象無法處理。所以就有 finalize() 方法的出現。

finalize() 訪法主要用於調用本地方法時開闢的空間未被回收的情況。java 只支持 C 與 C++ 兩種語言編寫的函數作爲本地方法(但對於函數內部調用其它語言編寫的內容則沒有限制,所以相當於支持任何一種語言)。

垃圾回收器可以顯著提高對象創建速度,也意味着 java 從堆分配空間的速度,可以與其它語言從堆棧上分配空間的速度媲美。垃圾回收器對對象重新排列,實現了一種高速且有無限空間可供分配的模型。

當需要裝載某個類的時候(通常爲該類創建第一個對象時),編譯器會先找到 .class 文件,然後將其字節碼裝入內存。此時有兩種選擇:編譯所有代碼或者進行惰性評估

編譯所有代碼的缺陷是,加載動作散落在整個程序的生命週期內,累計花費時間更長。並且會增加可執行代碼的長度(字節碼比編譯器展開的本地機器碼小很多),將產生頁面調度進而降低程序速度。

惰性評估是指只有在需要的時候才進行編譯,不需被執行的代碼不會被編譯。 HotSpot中應用了類似的方法,每次編譯都會進行優化。所以執行次數越多,速度越快。

可以通過給變量調用方法來進行初始化操作:int i = f(); int f(){return 11;};,方法也可以是帶參數的(參數必須是初始化完成的):int i = f(); int j = g(i);此處 i 已經過初始化,所以代碼正確;int j = g(i); int i= f();此處 i 未經過初始化,因此給 j 賦值會報錯。

自動初始化是無法被阻止的,將在構造方法被調用之前發生:int i; Counter(){i=7;}此處 i 先被賦予默認值,然後再賦值爲7。

對象的創建過程:

  1. 因爲構造器實際上是靜態方法,因此首次創建類對象或靜態方法被訪問時,解釋器需要查找類路徑,定位 .class 文件
  2. 載入 .class 文件,創建 class 對象,執行所有靜態初始化動作。也因此靜態初始化只有在 class 對象首次加載時進行
  3. 執行 new 語句創建對象時,首先在堆上爲其分配足夠的存儲空間
  4. 存儲空間清零,此時就自動將對象中所有的基本數據類型設成了默認值
  5. 執行所有出現於字段定義處的初始化操作
  6. 執行構造方法

可以直接使用 new 在數組中創建元素:Random r = new Random(47); int[] a = new int[r.nextInt(20)];,對於數字及字符,數組中自動初始化爲0,對於布爾值則初始化爲 false。

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