Object類中clone 方法

2021-10-07 15:00:23 字數 2656 閱讀 2539

使用場景

當我們需要建立乙個物件的副本的時候,並且在改變他們各自的內容的時候互不影響,就可以使用object類中clone()方法

使用clone()方法需要注意

需要實現cloneable介面,否則丟擲clonenotsupportedexception

需要呼叫super.clone()

該方法實現"淺拷貝"而不是「深拷貝」

「淺拷貝」和「深拷貝」的區別

淺拷貝:被拷貝的物件中不含有其他實體類物件的引用

深拷貝:被拷貝物件中含有其他實體類物件的引用,那麼這些實體類都需要實現cloneable介面,實現clone()方法

淺拷貝

/**

* @author: 保質期已過

* @date: 2020/6/3 22:28

* description:

* @version 1.0

*/@data

@allargsconstructor

(access = accesslevel.public)

public

class

address

@data

@allargsconstructor

(access=accesslevel.public)

public

class

person

implements

cloneable

}

測試淺拷貝

@org

.junit.jupiter.api.test

public

static

void

test01()

throws clonenotsupportedexception

輸出

person(name=張三, age=20, address=address(addressname=成都))

4.實體類物件拷貝問題

我們看到address實體類物件的引用,也被複製過來了,其實這裡只是複製了引用,並沒有建立address新的副本。執行如下測試**,但我們在修改拷貝後person物件的address中的addressname屬性值時,拷貝前的person中的address中的addressname屬性值也被更改了

@org

.junit.jupiter.api.test

public

void

test02()

throws clonenotsupportedexception

輸出

拷貝後的person:person(name=張三, age=20, address=address(addressname=成都))

拷貝前的person:person(name=張三, age=20, address=address(addressname=武漢))

深拷貝

改造address類,也實現cloneable介面,重寫clone()方法

/**

* @author: 保質期已過

* @date: 2020/6/3 22:28

* description:

* @version 1.0

*/@data

@allargsconstructor

(access = accesslevel.public)

public

class

address

implements

cloneable

}

改造person類,新增深拷貝的方法

/**

* @author: 保質期已過

* @date: 2020/6/3 21:45

* description:

* @version 1.0

*/@data

@allargsconstructor

(access=accesslevel.public)

public

class

person

implements

cloneable

//深拷貝

public person deepclone()

throws clonenotsupportedexception

}

測試深拷貝

@org

.junit.jupiter.api.test

public

void

test03()

throws clonenotsupportedexception

輸出

拷貝後的person:person(name=張三, age=20, address=address(addressname=武漢))

拷貝前的person:person(name=張三, age=20, address=address(addressname=成都))

Object類中clone 的使用方法

我們先看兩個圖 圖1 圖2由以上兩個圖,我們可以知道,要想使用clone 方法需要先implements cloneable介面 該介面是標記介面,也就意味著必須打上轉殖的標識你才能進行轉殖 再看圖2 object類中方法名前加protected意味著只有其子類才能訪問,其他類訪問需要子類重寫該方法...

object 物件中的clone

1.object中的clone執行的時候使用了rtti run time type identification 的機制,動態得找到目前正在呼叫clone方法的那個reference,根據它的大小申請記憶體空間,然後進行bitwise的複製,將該物件的記憶體空間完全複製到新的空間中去,從而達到sha...

Object類中的方法

hashcode 用於獲取物件的雜湊值,這個值的作用是檢索,具體的作用可以參考這裡 雜湊值相同的物件不一定equale equals 返回true的兩個物件一定相同。class package.name.在使用的時候要求在synchronize語句中使用 wait 用於讓當前執行緒失去操作許可權,當...