1.概念
淺拷貝會建立一個新對象,新物件和原始物件本身沒有任何關係,新物件和原始物件不等,但是新對象的屬性和老物件相同。具體可以看以下區別:
(1)如果屬性是基本型別(int,double,long,boolean等),拷貝的就是基本型別的值;
(2)如果屬性是引用類型,拷貝的就是記憶體位址(即複製引用但不複製引用的物件) ,因此如果其中一個物件改變了這個位址,就會影響到另一個物件。
2.原理
如果原型物件的成員變數是值類型,將複製一份給克隆對象,也就是說在堆中擁有獨立的空間;如果原型對象的成員變數是引用類型,則將引用對象的地址複製一份給克隆對象,也就是說原型對象和克隆對象的成員變數指向相同的記憶體地址。換句話說,在淺克隆中,當物件被複製時只複製它本身和其中包含的值類型的成員變量,而引用類型的成員物件並沒有複製。
3.使用實例
需要拷貝的類別上實作Cloneable介面並重寫其clone()方法
class Father{ String name; public Father(String name) { this.name=name; } @Override public String toString() { return "Father{" + "name='" + name + '\'' + '}'; } } class Son implements Cloneable { int age; String name; Father father; public Son(String name,int age) { this.age=age; this.name = name; } public Son(String name,int age, Father father) { this.age=age; this.name = name; this.father = father; } @Override public String toString() { return "Son{" + "age=" + age + ", name='" + name + '\'' + ", father=" + father + '}'; } @Override protected Son clone() throws CloneNotSupportedException { return (Son) super.clone(); } } public class test { public static void main(String[] args) throws CloneNotSupportedException { Father f=new Father("bigFather"); Son s1 = new Son("son1",13); s1.father=f; Son s2 = s1.clone(); System.out.println(s1); System.out.println(s2); System.out.println("s1==s2:"+(s1 == s2));//不相等 System.out.println("s1.name==s2.name:"+(s1.name == s2.name));//相等 System.out.println(); //但是他们的Father father 和String name的引用一样 s1.age=12; s1.father.name="smallFather";//s1.father引用未变 s1.name="son222";//类似 s1.name=new String("son222") 引用发生变化 System.out.println("s1.Father==s2.Father:"+(s1.father == s2.father));//相等 System.out.println("s1.name==s2.name:"+(s1.name == s2.name));//不相等 System.out.println(s1); System.out.println(s2); } }
以上是java淺拷貝如何使用的詳細內容。更多資訊請關注PHP中文網其他相關文章!