使用場景
當我們需要建立乙個物件的副本的時候,並且在改變他們各自的內容的時候互不影響,就可以使用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()方法
改造person類,新增深拷貝的方法/**
* @author: 保質期已過
* @date: 2020/6/3 22:28
* description:
* @version 1.0
*/@data
@allargsconstructor
(access = accesslevel.public)
public
class
address
implements
cloneable
}
測試深拷貝/**
* @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 用於讓當前執行緒失去操作許可權,當...