1. 程式人生 > >Java學習筆記----你可能不知道那些知識,物件複製與引用

Java學習筆記----你可能不知道那些知識,物件複製與引用

1.private ,protected,static不能用來修飾interface。

2.java在處理基本資料型別(例如int ,char,double)時,都是採用按值傳遞的方式執行,除此之外的其它型別都是按引用傳遞的方式執行。物件除了在函式呼叫時時引用傳遞,在使用“=”賦值時也是採用引用傳遞。

3.如何在java中進行物件的複製,而不是引用。舉例:

class Obj implements Cloneable{
	private int a=0;
	public int getA(){
		return a;
	}
	public void setA(int b){
		this.a=b;
	}
	public void changedA(){
		this.a=1;
	}
	public Object clone(){
		Object o=null;
		try{
		0=(Obj)super.clone();
		}catch(CloneNotSupportedException e){
			e.printStatckTrace();
		}
		return o;
	}
}
public class TestRef{
	public static void main(String args[]){
		Obj a= new Obj();
		Obj b=(Obj)a.clone();
		b.changedA();
		System.out.println("a:"+a.getA());
		System.out.println("b:"+b.getA());
	}
}

程式執行結果為:

a:0

b:1

因此要賦值一個類,必須實現Cloneable介面。步驟:

(1)實現clone的累首先要繼承Cloneable介面。Cloneable介面實質是一個標識介面(沒有任何方法,即空介面)

(2)在類中重寫Object類的clone()方法。

(3)在clone()方法中呼叫super.clone().

(4)把淺複製的引用指向原型物件新的克隆體。

當類中有除基本資料以外的其它複雜物件屬性時,在重寫clone()方法時要對非基本型別的屬性完成深複製。舉例如下:

class Obj implements Cloneable{
private Date birthday = new Date();
	private int a=0;
	public int getA(){
		return a;
	}
	public void setA(int b){
		this.a=b;
	}
	public void changedA(){
		this.a=1;
	}
	public Date getDate(){
		return birthday();
	}
	public void setDate(Date date){
		this.birthday = date;
	}
    public void changeDate(){
		this.birthday.setMonth(4);
    }
	public Object clone(){
		Object o=null;
		try{
		0=(Obj)super.clone();
		}catch(CloneNotSupportedException e){
			e.printStatckTrace();
		}
	//實現深複製
	o.birthday=(Date)this.getDate().clone();
		return o;
	}
}
public class TestRef{
	public static void main(String args[]){
		Obj a= new Obj();
		Obj b=(Obj)a.clone();
		b.changedA();
		System.out.println("a:"+a.getA());
		System.out.println("b:"+b.getA());
	}
}


淺複製和深複製的區別:

淺複製:被複制物件的所有變數都含有與原來物件相同的值,而所有其他物件的引用仍然指向原來的物件相同的值,而所有對其他物件的引用仍然指向原來的物件。

深複製:被複制物件的所有變數都含有與原來物件相同的值,出去那些引用其他物件的變數。那些引用其他物件變數將指向被複制的新物件,而不再是原有的那些被引用的物件都複製了一遍。