1. 構造方法
構造方法負責對象的初始化工作,為實例變量賦予合適的初始值。必須滿足以下的語法規則:
- 方法名與類名相同;
- 不要返回類型(例如return、void等);
- 不能被static、final、native、abstract和synchronized修飾,不能被子類繼承。
例如以下例子:
1.1. 默認構造方法
默認構造方法時沒有參數的構造方法,分為
a.隱含的默認構造方法:public ClassName(){}
b.程序顯示定義默認構造方法:public Employee(){this("無名氏");}
可以調用ClassName類的默認構造方法來創建對象,沒有默認構造方法則不合法,例如:
1.2. 重載構造方法
通過new創建一個對象后,在不同的條件下,對象可能會有不同的初始化行為,可以通過重載構造方法來表達對象的初始化行為。具體參考this關鍵字的用法。
1.3. 子類調用父類的構造方法
父類的構造方法不能被子類調用,可以通過super語句調用父類的構造方法。例如:
用super調用父類的構造方法必須遵守以下規則:
1. 子類的構造方法中不能直接通過父類的方法名調用父類的構造方法,使用super語句;
2. 加入在子類的構造方法中有super語句,它必須作為構造方法的第一條語句(同this語句);
1.4. 構造方法的作用域
- 當前類的其他構造方法通過this語句調用;
- 當前類的子類的構造方法通過super語句調用;
- 在程序中通過new語句調用。
1.5. 構造方法的private訪問級別
構造方法為private級別時,意味着只能在當前類中訪問它:當前類的其他構造方法中可以通過this語句調用,此外還可以在當前類的成員方法中使用new調用。
以下場合中,可以把類的所有構造方法聲明為private:
- 這個類中僅僅包含一些供其他程序調用的靜態方法,沒有任何實例方法。
- 禁止這個類被繼承。聲明為private后,如果定義了它的子類,子類的方法中無法調用父類的任何構造方法。
- 類需要把構造自身實例的細節封裝起來,不允許其他程序通過new語句創建這個類的實例。提供靜態方法。
Java中類的方法分為類方法(用static修飾,也叫靜態方法)和實例方法(沒有用static修飾,也叫非靜態方法),這兩種方法之間有什么區別呢?
一. 實例方法
當類的字節碼文件加載到內存中時,類的實例方法並沒有被分配入口地址,只有當該類的對象創建以后,實例方法才分配了入口地址。從而實例方法可以被類創建的所有對象調用,還有一點需要注意,當我們創建第一個類的對象時,實例方法的入口地址會完成分配,當后續在創建對象時,不會再分配新的入口地址,也可以說,該類的所有對象共享實例方法的入口地址,當該類的所有對象被銷毀,入口地址才會消失。
二. 類方法
當類的字節碼文件加載到內存,類方法的入口地址就會分配完成,所以類方法不僅可以被該類的對象調用,也可以直接通過類名完成調用。類方法的入口地址只有程序退出時消失。
因為類方法的入口地址的分配要早於實例方法的入口地址分配時間,所有在定義類方法和實例方法是有以下規則需要遵循:
1. 在類方法中不能引用實例變量
實例變量的定義類似實例方法,沒有用static修飾的變量,實例變量的創建與實例方法的創建相同,也是在類的對象創建時完成,所以在類方法中是不能引用實例變量的,因為這個時候實例變量還沒有分配內存地址。
2. 在類方法中不能使用super和this關鍵字
這是因為super和this都指向的是父類和本類的對象,而在類方法中調用的時候,這些指代的對象有可能都還沒有創建。
3. 類方法中不能調用實例方法
原因同1。
與類方法相比,實例方法的定義就沒有什么限制了:
1. 實例方法可以引用類變量和實例變量
2. 實例方法可以使用super和this關鍵字
3. 實例方法中可以調用類方法