1. 程式人生 > >Java中構造方法、實例方法、類方法的區別

Java中構造方法、實例方法、類方法的區別

而在 class syn 此外 alt 創建 子類 語法規則 自身

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. 實例方法中可以調用類方法

Java中構造方法、實例方法、類方法的區別