Java學習筆記----你可能不知道那些知識,物件複製與引用
阿新 • • 發佈:2019-02-07
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()); } }
淺複製和深複製的區別:
淺複製:被複制物件的所有變數都含有與原來物件相同的值,而所有其他物件的引用仍然指向原來的物件相同的值,而所有對其他物件的引用仍然指向原來的物件。
深複製:被複制物件的所有變數都含有與原來物件相同的值,出去那些引用其他物件的變數。那些引用其他物件變數將指向被複制的新物件,而不再是原有的那些被引用的物件都複製了一遍。