1. 類變量和實例變量
類變量即類成員變量中的靜態變量,它們可以通過類名來直接訪問。
實例變量是類成員變量中的非靜態變量,只有在實例化對象之后通過對象來訪問。
2. 空間分配的時間不同
類變量是在類加載后的准備階段在方法區分配內存的。
實例變量是在類實例化為對象的時候在堆中分配內存。
3. 初始化
類變量在准備階段會進行默認初始化,當某些條件滿足時候會觸發類的初始化。詳見《深入理解java虛擬機》的類加載機制。
實例變量在空間分配內存后,虛擬機會將所分配到的內存空間都初始化為零值(不包括對象頭)。這一步操作保證了對象的實例字段在java代碼中可以不賦初值就可以直接訪問,程序能訪問到這些字段的數據類型所對應的零值。
對於局部變量,只能顯示地進行初始化,否則不能訪問該變量的值。
4. final關鍵字
當final關鍵字作用於類變量時,必須有顯示的初始化。在聲名對象的語句中初始化,或者在靜態代碼塊中進行初始化。
當final關鍵字作用於實例變量時,也必須進行顯示的初始化。在聲名對象的語句中初始化,或者在構造代碼塊中進行初始化,或者在所有的構造函數中進行初始化。
final修飾的變量只能初始化化一次,因此該變量已經在一種方式中進行過初始化,則不能在另一種方式再進行一次初始化。