Try   HackMD

物件住在哪裡?

tags: NTU-CE Computer Programming Java Programming Language

每當我們創建物件時其實我們是在幫一堆位元資料找一個家安置,而那個家就是俗稱的記憶體位置。
Object o = new Object();

以下示範物件何時會隨著「=」搬家:

After tmpLine = lines[i - 1];
Temporary Line is at Line2D@6d06d69c
Indexed Line is at Line2D@6d06d69c
After lines[i - 1] = lines[j];
Temporary Line is at Line2D@6d06d69c
Indexed Line is at Line2D@7852e922
After tmpLine = lines[i - 1];
Temporary Line is at Line2D@4e25154f
Indexed Line is at Line2D@4e25154f
After lines[i - 1] = lines[j];
Temporary Line is at Line2D@4e25154f
Indexed Line is at Line2D@6d06d69c
After tmpLine = lines[i - 1];
Temporary Line is at Line2D@4e25154f
Indexed Line is at Line2D@4e25154f
After lines[i - 1] = lines[j];
Temporary Line is at Line2D@4e25154f
Indexed Line is at Line2D@70dea4e
After tmpLine = lines[i - 1];
Temporary Line is at Line2D@4e25154f
Indexed Line is at Line2D@4e25154f
After lines[i - 1] = lines[j];
Temporary Line is at Line2D@4e25154f
Indexed Line is at Line2D@5c647e05
After tmpLine = lines[i - 1];
Temporary Line is at Line2D@4e25154f
Indexed Line is at Line2D@4e25154f
After lines[i - 1] = lines[j];
Temporary Line is at Line2D@4e25154f
Indexed Line is at Line2D@4e25154f

直接看碼:

public class TestLine2D {
	public static void main(String[] args) {
		Line2D[] lines = new Line2D[5];
		for (int i = 0; i < lines.length; i++) {
			lines[i] = new Line2D(Math.random() * 10, Math.random() * 10, Math.random() * 10, Math.random() * 10);
		}

		printInShuffle(lines);

	}
	
	public static void printInSequence(Line2D[] lines){
		for(Line2D line: lines){
			System.out.print(" " + line.getLength());
		}	
		System.out.print("\n");
	}
	
	public static void printInShuffle(Line2D[] lines){
		Line2D tmpLine;
		for(int i = lines.length ; i >= 1 ; i--){
			int j = (int)(Math.random() * i);
			tmpLine = lines[i - 1];
			System.out.println("After tmpLine = lines[i - 1];");
			System.out.println("Temporary Line is at " + tmpLine);
			System.out.println("Indexed Line is at " + lines[i-1]);
			lines[i - 1] = lines[j];
			System.out.println("After lines[i - 1] = lines[j];");
			System.out.println("Temporary Line is at " + tmpLine);
			System.out.println("Indexed Line is at " + lines[i-1]);
			lines[j] = tmpLine;
		}
		
	}

}

class Line2D {
	
	private double x1;
	private double y1;
	private double x2;
	private double y2;
	private double length;
	
	Line2D(double x1, double y1, double x2, double y2){
		this.x1 = x1;
		this.y1 = y1;
		this.x2 = x2;
		this.y2 = y2;
		this.length = Math.sqrt(Math.pow(y2-y1, 2) + Math.pow(x2-x1, 2));
	}
	
	public double getLength(){
		return this.length;
	}
	
}