国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

java基礎(chǔ)——淺克隆與深克隆

winterdawn / 856人閱讀

摘要:為什么使用存在一個對象,已有初始值,這時候可能需要一個新的對象和相同,但是和是兩個獨(dú)立的對象,任意一個改動都不影響其中一個的值,但是的初始值由確定,這時候就是最有效也是最簡單的方法。

為什么使用clone

存在一個對象A,A已有初始值,這時候可能需要一個新的對象B和A相同,但是A和B是兩個獨(dú)立的對象,任意一個改動都不影響其中一個的值,但是B的初始值由A確定,這時候clone就是最有效也是最簡單的方法。

new一個對象和clone一個對象的區(qū)別

new操作符的本意是分配內(nèi)存空間,java程序執(zhí)行到new操作符時,首先去看new操作符后面的類型,知道類型才能知道需要分配多大的內(nèi)存空間,分配完成,調(diào)用構(gòu)造函數(shù),填充對象,完成對象的初始化。

clone的第一步也是分配內(nèi)存,java程序執(zhí)行到clone這一步時,分配的內(nèi)存和調(diào)用clone方法的對象相同,在根據(jù)原對象完成對新對象的初始化,一個新的對象就被創(chuàng)建完成。

復(fù)制對象和克隆對象

需要克隆的對象要繼承Cloneable接口,并重寫clone()方法

復(fù)制對象

定義類:

public class People1 {
    private String name;
    private Integer age;

    public People1(String name, Integer age) {
        this.name = name;
        this.age = age;
    }
}

復(fù)制測試

public class test {
    public static void main(String[] args) {
        People1 people1 = new People1("people",18);
        People1 people11 = people1;

        System.out.println(people1);
        System.out.println(people11);
        System.out.println(people1 == people11);
    }
}

結(jié)果:

證明復(fù)制對象只是指向原來的對象,people1和people11只是引用同一個對象

clone對象

定義類:

public class People2 implements Cloneable{
    private String name;
    private Integer age;

    public People2(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public Integer getAge() {
        return age;
    }
    
    public void setName(String name) {
        this.name = name;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

測試:

public class test {
    public static void main(String[] args) {
        
        //clone
        People2 people2 = new People2("people",18);
        People2 people22 = null;
        try {
            people22 = (People2) people2.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }

        System.out.println(people2);
        System.out.println(people22);
        System.out.println(people2 == people22);
    }
}

結(jié)果:


可以看出people2和people22指向的對象并不是同一個的

淺克隆與深克隆

定義類:
Student類:

public class Student implements Cloneable{
    private String name;
    private Integer age;
    private Teacher teacher;

    public Student(String name, Integer age,Teacher teacher) {
        this.name = name;
        this.age = age;
        this.teacher = teacher;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public Teacher getTeacher() {
        return teacher;
    }

    public void setTeacher(Teacher teacher) {
        this.teacher = teacher;
    }

    @Override
     public String toString() {
         return "學(xué)生: name=" + name + ", age=" + age + ",指導(dǎo)" + teacher;
      }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

Teacher類

public class Teacher {
    private String name;
    private Integer age;

    public Teacher(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "老師:name=" + name + ", age=" + age ;
    }
}
淺克隆

main函數(shù)

public class test2 {
    public static void main(String[] args) {
        Teacher teacher = new Teacher("劉老師",18);
        Student student1 = new Student("小明",10,teacher);
        Student student2 = null;
        try {
            student2 = (Student) student1.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        Teacher t1 = student2.getTeacher();
        t1.setName("張老師");
        t1.setAge(30);
        student2.setName("小紅");
        student2.setAge(9);
        student2.setTeacher(t1);
        System.out.println(student1);
        System.out.println(student2);
    }
}

結(jié)果:

修改student2中的Teacher類,student1也跟著改變,而修改姓名和年齡并不會修改,由此得出才重新clone方法時不能直接super

深克隆

Teacher繼承Cloneable

Student重寫clone方法

        Student newStudent = (Student) super.clone();
        newStudent.teacher = (Teacher) teacher.clone();
        return newStudent;

運(yùn)行上方測試代碼,結(jié)果:


完成預(yù)想結(jié)果

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/75469.html

相關(guān)文章

  • Java實(shí)現(xiàn)對象克隆的方法

    摘要:優(yōu)點(diǎn)簡單易實(shí)現(xiàn)缺點(diǎn)無法真正克隆對象深克隆實(shí)現(xiàn)通過遞歸克隆實(shí)現(xiàn)代碼輸出通過序列化實(shí)現(xiàn)代碼輸出結(jié)果分析采用深克隆能有效隔離源對象與克隆對象的聯(lián)系。 本文首發(fā)于cartoon的博客 ????轉(zhuǎn)載請注明出處:https://cartoonyu.github.io/cartoon-blog/post/java/java%E5%AE%9E%E7%8E%B0%E5%85%8B%E9%9A%86%E...

    zhoutk 評論0 收藏0
  • 拷貝與深拷貝

    摘要:二淺拷貝與深拷貝深拷貝和淺拷貝是只針對和這樣的引用數(shù)據(jù)類型的。淺拷貝是按位拷貝對象,它會創(chuàng)建一個新對象,這個對象有著原始對象屬性值的一份精確拷貝。對于字符串?dāng)?shù)字及布爾值來說不是或者對象,會拷貝這些值到新的數(shù)組里。 一、數(shù)據(jù)類型 數(shù)據(jù)分為基本數(shù)據(jù)類型(String, Number, Boolean, Null, Undefined,Symbol)和對象數(shù)據(jù)類型。 基本數(shù)據(jù)類型的特點(diǎn):直...

    hzc 評論0 收藏0
  • 拷貝與深拷貝

    摘要:二淺拷貝與深拷貝深拷貝和淺拷貝是只針對和這樣的引用數(shù)據(jù)類型的。淺拷貝是按位拷貝對象,它會創(chuàng)建一個新對象,這個對象有著原始對象屬性值的一份精確拷貝。對于字符串?dāng)?shù)字及布爾值來說不是或者對象,會拷貝這些值到新的數(shù)組里。 一、數(shù)據(jù)類型 數(shù)據(jù)分為基本數(shù)據(jù)類型(String, Number, Boolean, Null, Undefined,Symbol)和對象數(shù)據(jù)類型。 基本數(shù)據(jù)類型的特點(diǎn):直...

    史占廣 評論0 收藏0
  • 拷貝與深拷貝的區(qū)別

    摘要:淺拷貝與深拷貝一數(shù)據(jù)類型數(shù)據(jù)分為基本數(shù)據(jù)類型,和對象數(shù)據(jù)類型。淺拷貝是按位拷貝對象,它會創(chuàng)建一個新對象,這個對象有著原始對象屬性值的一份精確拷貝。對于字符串?dāng)?shù)字及布爾值來說不是或者對象,會拷貝這些值到新的數(shù)組里。 淺拷貝與深拷貝 一、數(shù)據(jù)類型數(shù)據(jù)分為基本數(shù)據(jù)類型(String, Number, Boolean, Null, Undefined,Symbol)和對象數(shù)據(jù)類型。 基本數(shù)據(jù)類...

    jsyzchen 評論0 收藏0
  • 關(guān)于JavaScript的拷貝和深拷貝

    摘要:引用類型值引用類型值是保存在堆內(nèi)存中的對象,變量保存的只是指向該內(nèi)存的地址,在復(fù)制引用類型值的時候,其實(shí)只復(fù)制了指向該內(nèi)存的地址。 前言 要理解 JavaScript中淺拷貝和深拷貝的區(qū)別,首先要明白JavaScript的數(shù)據(jù)類型。JavaScript有兩種數(shù)據(jù)類型,基礎(chǔ)數(shù)據(jù)類型和引用數(shù)據(jù)類型。js的基本類型:undefined,null,string,boolean,number,s...

    shenhualong 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<