1. 程式人生 > >Java深拷貝與淺拷貝【複習】

Java深拷貝與淺拷貝【複習】

Java的深拷貝和淺拷貝,我用一個最直接的例子來說明,需要執行程式碼直接拷貝過去,直接執行。

淺拷貝:重寫clone()方法,返回super.clone()方法,該方法在物件呼叫時候預設返回的就是淺拷貝,淺拷貝時只拷貝物件本身和物件的基本變數,物件的引用變數不會進行拷貝,還是指向原來的物件。

深拷貝:需要重寫clone()方法,我在程式碼中已經註釋掉了,如果該類有多個物件引用,需要都進行clone重寫,因為每次clone都是跟之前物件的地址是不同的,所以物件是使用==比較符是不相等返回false。

/**
 * @author 冉野 E-mail:[email protected]
.com * @version 建立時間:18/9/29 下午5:55 */ public class CloneableTest2 implements Cloneable { private String name; private CloneableTest cloneableTest; private String address; public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public String getName() { return name; } public void setName(String name) { this.name = name; } public CloneableTest getCloneableTest() { return cloneableTest; } public void setCloneableTest(CloneableTest cloneableTest) { this.cloneableTest = cloneableTest; } @Override public boolean equals(Object o) { if (this == o) return true; if (!(o instanceof CloneableTest2)) return false; CloneableTest2 that = (CloneableTest2) o; return Objects.equals(getName(), that.getName()) && Objects.equals(getCloneableTest(), that.getCloneableTest()); } @Override public int hashCode() { return Objects.hash(getName(), getCloneableTest()); } // 深拷貝時候的重寫clone()方法 @Override protected Object clone() throws CloneNotSupportedException { CloneableTest2 cloneableTest2 = (CloneableTest2) super.clone(); cloneableTest2.cloneableTest = (CloneableTest) cloneableTest2.getCloneableTest().clone(); return cloneableTest2; } // 淺拷貝時候clone()方法 // @Override // protected Object clone() throws CloneNotSupportedException { // return super.clone(); // } public static void main(String[] args) { CloneableTest2 cl1 = new CloneableTest2(); CloneableTest cloneableTest = new CloneableTest("1",1); cl1.setCloneableTest(cloneableTest); CloneableTest2 cl2 = null; try { // 淺拷貝是指在物件拷貝時候僅僅是拷貝物件本身和基本變數 關於物件的引用型別變數不進行拷貝 cl2 = (CloneableTest2) cl1.clone(); System.out.println(cl1.equals(cl2)); // true System.out.println(cl1.getClass() == cl2.getClass()); // true System.out.println(cl1 == cl2); // false // 拷貝時 每次都是新的物件 所以 == 比較總是返回false System.out.println(cl1.getCloneableTest()==cl2.getCloneableTest());// false // 引用型別的變數 還是執行原來的物件 沒發生改變 但是深拷貝就會改變 // 構造方法鏈 子類在呼叫自己構造方法前 如果繼承父類 會先使用父類的構造方法 如果父類還繼承了別的類 則 // 也會先呼叫該父類的構造方法 } catch (CloneNotSupportedException e) { e.printStackTrace(); } } }

CloneableTest類

public class CloneableTest implements Cloneable{

    private String name;
    private int age;

    public CloneableTest(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof CloneableTest)) return false;
        CloneableTest that = (CloneableTest) o;
        return age == that.age &&
                Objects.equals(name, that.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }

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

相關推薦

Java拷貝拷貝複習

Java的深拷貝和淺拷貝,我用一個最直接的例子來說明,需要執行程式碼直接拷貝過去,直接執行。 淺拷貝:重寫clone()方法,返回super.clone()方法,該方法在物件呼叫時候預設返回的就是淺拷貝,淺拷貝時只拷貝物件本身和物件的基本變數,物件的引用變數不會進行拷貝,還

Java深入拷貝拷貝詳解

1.拷貝的引入 (1)引用拷貝 建立一個指向物件的引用變數的拷貝。 例1: Teacher teacher = new Teacher("Taylor",26); Teacher otherteacher = teacher; System.out.

JS拷貝拷貝的區別,實現拷貝的幾種方法

如何區分深拷貝與淺拷貝,簡單點來說,就是假設B複製了A,當修改A時,看B是否會發生變化,如果B也跟著變了,說明這是淺拷貝,拿人手短,如果B沒變,那就是深拷貝,自食其力。 此篇文章中也會簡單闡述到棧堆,基本資料型別與引用資料型別,因為這些概念能更好的讓你理解深拷貝與淺拷貝。 我們來舉個淺拷貝例

基礎 | Java拷貝拷貝

Object類中的clone()方法定義如下: /** * 僅對本包下的所有類和當前類的子類可見。 * 只有實現Cloneable介面的類的物件才能呼叫該方法,否則會丟擲異常 */ protected native Object clone() throws Cl

java拷貝拷貝

int apples = 5; int pears = apples; 不僅僅是int型別,其它七種原始資料型別(boolean,char,byte,short,float,double.long)同樣適用於該類情況。 但是如果你複製的是一個物件,情

Java中的拷貝拷貝(一)

概述 JAVA中物件的拷貝分兩種:深拷貝和淺拷貝。 物件的拷貝在記憶體中的體現即是在堆中新開闢一片空間,然後將要拷貝的物件拷貝一份到新開闢的空間上來。要拷貝的物件可能有各種基本資料型別的成員變數,也可

python測試開發棧—理解python拷貝拷貝的區別

記憶體的淺拷貝和深拷貝是面試時經常被問到的問題,如果不能理解其本質原理,有可能會答非所問,給面試官留下不好的印象。另外,理解淺拷貝和深拷貝的原理,還可以幫助我們理解Python記憶體機制。這篇文章將會通過一些例子,來驗證記憶體拷貝的過程,幫助大家理解記憶體拷貝的原理。 Python3中的資料型別 我們首先得知

C#深度學習の----拷貝拷貝

chan 深度 保存 交流 typeof sta 二進制 object with 本人在進行編程的時候遇到一個問題,要對一個綁定的依賴屬性進行賦值,改變屬性中的某一部分,綁定的目標上的所有值都發生了變化,著並不是我想要的,由此引出深淺拷貝的問題。(請加群交流:4352266

javaScript之拷貝拷貝

func array efi name 內存空間 數據 xtend 是否 -- js中有兩種數據類型: 1. 基本類型 : Number、String、Boolean、Null、Undefined 2. 復雜類型 : Object 、Ar

c++分文件定義 拷貝拷貝

淺拷貝1、#include <stdlib.h> #include <iostream> #include "Array.h" using namespace std; int main(void) { Array arr1; arr1.setCount(5); Array

字典的拷貝拷貝

/usr odin pri 修改 hal sha deepcopy data str 以前只知道用dict2 = dict1 來進行復制(備份),結果發現對dict2做增刪改等操作時,dict1也會隨之變化,反過來也這樣。沒有好好學習基礎的我,自然在這裏面吃了不少的虧。。。

iOS 圖文並茂的帶你了解拷貝拷貝

mstr ear span ini 5.7 [1] ring void 結束 一、概念與總結 1、淺拷貝 淺拷貝就是對內存地址的復制,讓目標對象指針和源對象指向同一片內存空間,當內存銷毀的時候,指向這片內存的幾個指針需要重新定義才可以使用,要不然會成為野

Python中拷貝拷貝區別

分配 img 地址 append 淺拷貝 pen image pre 內容 淺拷貝, list值是可變的,str值不可變,只能重新賦值 a=b=c=‘wjx‘print(a,b,c)c= ‘jmy‘#重新賦值了,所以內存分配了新的地址print(a,b,c)print(id

python:拷貝拷貝

pri 復制 空間 epc python import ams post name import copyname = ["sams", ["su", "ca"]]name0 = name#直接復制,指向同一內存空間name1 = copy.copy(name)#淺拷貝,也

python list的拷貝拷貝-以及初始化空白list的方法(2)

src 分享圖片 [1] 深拷貝 pen net .com 空白 tails 其實python對於深拷貝與淺拷貝的處理方式依然是很靈活的,甚至有一個專門的工具包copy來做個事情 來看以下這組list的拷貝方法: 已知lista是一個已經定義好了的list listb=l

拷貝拷貝

post false 所有 console oda 嵌套 lod cti 屬性。 淺拷貝 對於基本類型,淺拷貝是對值的復制,對於對象來說,淺拷貝只復制指向某個對象的指針,而不復制對象本身,並沒有開辟新的棧,也就是復制的結果是新舊對象還是共享同一塊內存,兩個對象指向同一個地址

js中的拷貝拷貝

nbsp 中一 局限性 深拷貝與淺拷貝 ext bsp post body extend 對於字符串類型,淺拷貝是對值的拷貝,對於對象來說,淺拷貝是對對象地址的拷貝,並沒有開辟新的棧,也就是拷貝的結果是兩個對象指向同一個地址,修改其中一個對象的屬性,則另一個對象的屬性也會改

JavaScript拷貝拷貝

javascript深拷貝與淺拷貝1.先看一個例子:從中可以看出,obj1拷貝了obj的值,但只是進行了地址的引用,修改obj1的值也影響到了obj的值,沒有創建新對象。 淺拷貝:對基本數據類型進行值傳遞,對引用數據類型進行引用傳遞般的拷貝。 深拷貝:對基本數據類型進行值傳遞,對引用數據類型,創建一個新的對象

python 的拷貝拷貝

bsp 分享 ima 都是 跟著 class 淺拷貝和深拷貝 分享圖片 src 一句話總結,淺拷貝只拷貝父對象,不拷貝子對像。 註意:淺拷貝和深拷貝的不同僅僅是對組合對象來說,所謂的組合對象就是包含了其它對象的對象,如列表,類實例。而對於數字、字符串以及其它“原子”類型,沒

ES6拷貝拷貝

olt 常用 依次 基本 對象 cnblogs 復制 過程 數據 JavaScript 中變量的賦值 結論:JavaScript中變量的賦值分為「傳值」與「傳址」。 基本數據類型的賦值,就是「傳值」;而引用類型變量賦值,實際上是「傳址」。基本數據類型變量的賦值、比較,只是值