1. 程式人生 > >java筆記5,記憶體解析

java筆記5,記憶體解析

例項1

//定義類:出生日期
class BirthDate{
	//類的屬性
	private	int	day;
	private	int	month;
	private	int	year;
	
	//構造方法:BirthDate
	public	BirthDate (int d, int m, int y){
		day = d; month = m; year = y;
	}
	
	//設定年月日
	public	void	 setDay(int d) {
		day = d;
	}

	public	void	 setMonth(int m) {
		month = m;
	}

	public	void	 setYear(int y) {
		year = y;
	}
	
	//獲得年月日
	public	int	getDay{
		return	day;
	}
	
	public	int	getMonth{
		return	month;
	}
	
	public	int	getYear{
		return	year;
	}

	//輸出結果
	public	void	display() {
		system.out.println(day+"-"+month+"-"+year;)
	}
}

public	class	Test{
	public static void main(String[] args){
		Test test = new text();	//區域性變數test存入棧記憶體,new出來的test物件在堆記憶體分配記憶體。
		int date = 9;	//區域性變數 date(是基本資料型別,所以在棧記憶體分配四個位元組,名為date,內容是9)
		BirthDate d1 = new BirthDate(7,7,1970);	//棧記憶體中d1,d2。堆記憶體的物件分別指向1970.1.1,。2000.1.1。
		BirthDate d2 = new BirthDate(1,1,2000);
		test.change1(date);
		test.change2(d1);
		test.change3(d2);
		system.out.prinln("date="+date);
		d1.display();	//打印出d1和d2的值
		d2.display();
	}

	public void change1(int i){
		i = 1234;	//呼叫change1方法時要在棧記憶體中給形參分配一空間,i的值為實參所傳的值9。執行完change1方法後i=1234,而date的值不變。且執行完change1之後,i消失,date不變。
	}
	
	public void change2(BirthDate b){	//因為使用方法中所傳的值為d1,所以方法開始之前,棧記憶體中的b和d1指向堆記憶體中的同一物件。
		b = new BirthDate(22,2,2004);	//在堆記憶體中新構建一個為2004.2.22.的物件,但是在方法執行完之後所分配的記憶體被清除。
	}
	
	public void change3(BirthDate b){
		b.setDay(22);		//會將d2中的第1天轉換為第22天,因為這裡面對的物件是d2,而不是新構建了一個物件。
	}
}	//方法通過物件呼叫,針對不同的物件呼叫的方法的作用域不同。

棧記憶體,堆記憶體

1:區域性變數在棧記憶體空間。
2:棧記憶體中的區域性變數指向堆記憶體中new出來的東西。
3:形式引數等同於區域性變數。
4:方法執行完畢後,棧記憶體為這個方法分配的記憶體空間全部消失,堆記憶體所分配的空間被java垃圾收集器清理。
5:地址相同,可以找到同樣的物件。

例項2

定義一個點類用來表示三維空間的點要求如下
1:可以生成具有特定座標的點物件。
2:提供可以設定三個座標的方法。
3:提供可以計算該點距離遠點距離平方的方法。
4:編寫程式驗證上述三條。

class	point{
	double x , y , z;

	point( double_x,double_y , double_z){
	x = _x;
	y = _y;
	z = _z;
	} 
	void setX(double _x){
		x = _x;
	}
	
		void setX(double _x){
		x = _x;
	}
	
		void setX(double _x){
		x = _x;
	}

	double	getDistance(Point p){
		return(x-p.x)*(x-p.x)+(y-p.y)(y-p.y)+(z-p.z)(z-p.z);	//返回值在棧記憶體中分配了一個空間,方法返回以後,這個空間不存在,即列印之後,分配的記憶體消失
	}
}	
	
public	class	TsetPoint{
	public	static	void	main(String[] args){
		Point p = new Point(1.0,2.0,3.0);	//堆記憶體裡分配棧記憶體中P所指向的部分的記憶體,執行Point方法時,首先在棧記憶體中分配三個記憶體,分別為_x,_y,_z,之後,將棧記憶體中這三個變數的值分別傳給堆記憶體中的x,y,z。之後區域性變數_x,_y,_z消失。
		Point p1 = new Point(0.0,0.0,0.0);
		System.out.println(p.getDistance(p1));	//棧記憶體中為這條語句中的p分配一個記憶體,但它與前邊的那個p不相同,並且這裡的p與p1在棧記憶體中的地址相同,指向同一個物件。

	p.setX(5.0);
	system.out.println(p.getDistance(new	Point(1.0,1.0,1.0)));	//從裡向外,第一部分:堆記憶體為(1.0,1.0,1.0,)分配空間,無名字,未在棧記憶體中分配空間。第二部分,棧記憶體中分配的P指向了第一部分的(~)。
	}
}