首頁  >  文章  >  Java  >  java淺拷貝如何使用

java淺拷貝如何使用

PHPz
PHPz轉載
2023-05-02 15:01:061573瀏覽

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中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除