[javase學習筆記]-7.9 成員變數與靜態變數的區別
這一節我們看一看成員變數與靜態變數的區別所在。
什麼是靜態變數呢?我們上節用static關鍵字時就提到了靜態變數。也就是說用static關鍵字修飾的變數就是靜態變數。
我們在6.4節學習了成員變數與局部變數的區別,這一節我們重點看看成員變數與靜態變數之間的區別。
我們看代碼:
class Person{String name;//姓名,這是一個成員變數static String country = "中國";//國籍,這是一個靜態變數public void printInfo(){System.out.println(name+":"+country);}}
上面的代碼中我們可以看到變數name是一個成員變數,而country是一個靜態變數,用static關鍵字修飾。
這裡我們通過上一節static關鍵字的特點和成員變數的特點我們總結四個方面的區別:
1.兩個變數的生命週期不同:
成員變數:隨著對象的建立而存在,隨著對象的被回收而釋放。
靜態變數:隨著類的載入而存在,隨著類的消失而消失。
那麼類什麼時候消失呢?一般情況下,虛擬機器結束了,類就結束了,當然這隻是說一般情況下。
2.兩個變數的調用方式不同:
我們來看一個上面代碼的測試:
class StaticTest {public static void main(String[] args) {Person p = new Person();p.name = "小強";String name = Person.name;System.out.println(p.country+"--"+Person.country);}}結果:
我們可以看到直接用類名來調用成員變數就會出現“無法從靜態上下文中訪問非靜態變數”的錯誤。
當我們把這名話注釋之後再來運行:
class StaticTest {public static void main(String[] args) {Person p = new Person();p.name = "小強";//String name = Person.name;System.out.println(p.country+"--"+Person.country);}}結果:
程式正常運行併合法訪問,所以我們可以總結出下面的區別:
成員變數:只能被對象調用。
靜態變數:既可被對象調用,也可被類調用。上一節我們就已經學習了static修飾的成員可以直接用類名調用。
3.兩個變數的別名不同:
成員變數:又稱為執行個體變數。
靜態變數:又稱為類變數。
4.兩個變數的儲存位置不同:
成員變數:儲存在堆記憶體中的對象中,所以也叫對象的特有資料。
靜態變數:儲存在方法區(共用資料區)的靜態區中,所以也叫類的共用資料。