1. 程式人生 > >[javase學習筆記]-8.2 成員變量與靜態變量的差別

[javase學習筆記]-8.2 成員變量與靜態變量的差別

key [] cte 執行 div 學習 article alt art

這一節我們看一看成員變量與靜態變量的差別所在。


什麽是靜態變量呢?我們上節用statickeyword時就提到了靜態變量。也就是說用statickeyword修飾的變量就是靜態變量。

我們在6.4節學習了成員變量與局部變量的差別。這一節我們重點看看成員變量與靜態變量之間的差別。

我們看代碼:

class Person
{
	String name;//姓名,這是一個成員變量
	static String country = "中國";//國籍,這是一個靜態變量

	public void printInfo()
	{
		System.out.println(name+":"+country);
	}
}

上面的代碼中我們能夠看到變量name是一個成員變量,而country是一個靜態變量,用statickeyword修飾。

這裏我們通過上一節statickeyword的特點和成員變量的特點我們總結四個方面的差別:


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.兩個變量的存儲位置不同:

成員變量:存儲在堆內存中的對象中,所以也叫對象的特有數據。

靜態變量:存儲在方法區(共享數據區)的靜態區中,所以也叫類的共享數據。


[javase學習筆記]-8.2 成員變量與靜態變量的差別