構造方法沒有返回值,與 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。
對象的創建過程:
- 因爲構造器實際上是靜態方法,因此首次創建類對象或靜態方法被訪問時,解釋器需要查找類路徑,定位 .class 文件
- 載入 .class 文件,創建 class 對象,執行所有靜態初始化動作。也因此靜態初始化只有在 class 對象首次加載時進行
- 執行 new 語句創建對象時,首先在堆上爲其分配足夠的存儲空間
- 存儲空間清零,此時就自動將對象中所有的基本數據類型設成了默認值
- 執行所有出現於字段定義處的初始化操作
- 執行構造方法
可以直接使用 new 在數組中創建元素:Random r = new Random(47); int[] a = new int[r.nextInt(20)];
,對於數字及字符,數組中自動初始化爲0,對於布爾值則初始化爲 false。