1. 程式人生 > >[javase學習筆記]-6.4 成員變量與局部變量

[javase學習筆記]-6.4 成員變量與局部變量

ava 包含成員 -m img 不同之處 棧內存 RM 代碼塊 pub

前面我們學習了類的定義,我們不難理解,定義類事實上就是在定義類中的成員.

成員包含成員變量和成員函數.

說到成員變量,我們非常自然會想到前面提到過的局部變量,那麽它們之間有什麽差別呢?

首先我們定義一個People類:

class People//定義一個People類
{
	String name;//姓名屬性
	int age;//年齡屬性
	char sex;
	void run()//跑的方法
	{
		System.out.println(name+"開始跑步了.");
	}
	void information()
	{
		System.out.println("姓名:"+name+";\n性別:"+sex+";\n年齡:"+age+".");
	}
}


然後我們從四個方面來分析下這兩種變量的差別.


1.從它們的定義環境來分析,我們看一段代碼.

class PeopleTest 
{
	public static void main(String[] args) 
	{
		People kobe = new People();//創建一個People的對象kobe
		String name = "jordan";
		int age = 49;
		char sex = ‘男‘;
		kobe.name = "KOBE";
		kobe.age = 37;
		kobe.sex = ‘男‘;
		kobe.information();
		kobe.run();
	}
}
我們能夠看到People類中我們定義了name,age,sex這三個變量就是成員變量;而在main方法中我們定義了kobe,name,age,sex這四個變量都是局部變量,那麽非常明顯就看出了它們的不同之處:

成員變量定義在類中,整個類中都能夠訪問.

局部變量定義在函數,語句,局部代碼塊中,僅僅在所屬區域有效.


2,從它們在內在中存放形式來分析:

聯系上一節以及4.3節的函數的內存分配兩節我們非常自然知道這兩種變量的差別在於:

成員變量存在於堆內存的對象中.

局部變量存在於棧內存的方法中.


3,從它們的默認初始化來分析,我們執行上面的代碼:

class PeopleTest 
{
	public static void main(String[] args) 
	{
		People kobe = new People();//創建一個People的對象kobe
		String name = "jordan";
		int age = 49;
		char sex = ‘男‘;
		kobe.name = "KOBE";
		kobe.age = 37;
		kobe.sex = ‘男‘;
		kobe.information();
		kobe.run();
		System.out.println("name:"+name+";\nsex:"+sex+";\nage:"+age+".");
	}
}
結果例如以下:

技術分享圖片

我們再把該代碼稍做改動:

class PeopleTest 
{
	public static void main(String[] args) 
	{
		People kobe = new People();//創建一個People的對象kobe
		String name;
		int age;
		char sex;
		kobe.name = "KOBE";
		kobe.age = 37;
		kobe.sex = ‘男‘;
		kobe.information();
		kobe.run();
		System.out.println("name:"+name+";\nsex:"+sex+";\nage:"+age+".");
	}
}
結果:

技術分享圖片

我們看出一個非常顯然的差別就是:

成員變量都有默認初始化值.

局部變量沒有默認初始化值.

所以我們在定義成員變量時,假設我們須要特定的初始值,我們就一定要顯性初始化詳細值.對於局部變量,假設我們不初始化,當操作該變量時編譯會提示未初始化的錯誤.

4.從它們的生命周期來分析,我們再對上面的代碼進行一下改動:

class PeopleTest 
{
	public static void main(String[] args) 
	{
		People kobe = new People();//創建一個People的對象kobe
		String name = "jordan";
		{
			int age = 49;
			char sex = ‘男‘;
			System.out.println("name:"+name+";\nsex:"+sex+";\nage:"+age+".");//能夠打印出三個局部變量的值
		}
		kobe.name = "KOBE";
		kobe.age = 37;
		kobe.sex = ‘男‘;
		kobe.information();
		kobe.run();
		System.out.println("name:"+name+";\nsex:"+sex+";\nage:"+age+".");//報錯,找不到sex和age這兩個變量
	}
}
結果:

技術分享圖片

而當我們把最後一句打印語句凝視之後的結果:

技術分享圖片

我們能夠看到:

成員變量隨著對象的創建而存在,隨著對象的消失而消失.

局部變量隨著所屬區域的執行而存在,隨著所屬區域的結束而釋放.


最後,我們再來看一個比較須要註意的地方,那就是成員變量和局部變量的同名情況.

我們把People類改動一下:

class People//定義一個People類
{
	String name;//姓名屬性
	int age;//年齡屬性
	char sex;
	void run()//跑的方法
	{
		System.out.println(name+"開始跑步了.");
	}
	void information()
	{
		String name = "JAMES";
		int age = 29;
		char sex = ‘女‘;
		System.out.println("姓名:"+name+";\n性別:"+sex+";\n年齡:"+age+".");
	}
}
結果:

技術分享圖片

我們看到在打印出了局部變量的值,這是因為局部變量在棧的方法中,程序會把值直接賦值給局部變量,假設當在棧中找不到,則到堆內存中尋找指定的成員變量.這一點在以後的操作中一定要小心.

成員變量都有默認初始化值.

局部變量沒有默認初始化值.

[javase學習筆記]-6.4 成員變量與局部變量