java筆記5,記憶體解析
阿新 • • 發佈:2018-11-26
例項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指向了第一部分的(~)。 } }