1. 變量的類型
在java語言中,變量的類型有3中:成員變量、靜態變量、局部變量
(1)成員變量
當類被實例化時,成員變量就會在內存中分配空間被初始化,直到這個實例化對象的生命週期結束時,成員變量的生命週期才結束。所以,類的成員變量的作用範圍與類的實例化對象的作用範圍相同。
(2)靜態變量
由static關鍵字修飾的成員變量被稱爲靜態變量。類似於C++中的全局變量。靜態變量不依賴於特定的實例,而是被所有的實例共享。只要一個類被加載,JVM就會給類的靜態變量分配存儲空間,因此,可以直接通過類名和變量名來訪問靜態變量。
(3)局部變量
局部變量的作用域與可見性爲它所在的花括號內。
從內存分配的角度來看,
成員變量的數據存儲於堆中該成員變量所屬的對象裏面,堆內存中存放的變量都會進行默認初始化。
局部變量(包括基本數據類型和對象引用) 存放在棧內存中,局部變量的大小是可以被確定的;局部變量會在其自身所屬方法(或代碼塊)執行完畢後,被自動釋放。所以局部變量的生命週期也是可以被確定的。棧內存中存放的局部變量不會進行默認初始化。 所以,我們在聲明一個成員變量時,可以不用對其進行初始化賦值。而如果聲明一個局部變量卻未進行初始賦值,如果想對其進行使用就會報編譯異常的原因了。
靜態變量存儲在方法區中,在類被加載時,JVM就會給爲其分配存儲空間。
2. 成員變量的作用域
作用域與可見性 | 當前類 | 同一package | 子類 | 其他package |
public | √ | √ | √ | √ |
protected | √ | √ | √ | × |
default | √ | √ | × | × |
private | √ | × | × | × |
需要注意的是,這些修飾符只能用來修飾成員變量,不能修飾局部變量。
private和protected只能用來修飾內部類,不能修飾外部類。