賦值:
class
teacher
class
student
student s1 = new student();
student s2 = s1;
s1 == s2,指向的記憶體區域相同
拷貝:
class
teacher
class
student implement cloneable
}
student s1 = new student();
student s2 = s1.clone();
s1 != s2, 指向不同的記憶體區域
根據 s1.teacher 語 s2.teacher的記憶體區相不相同分為深拷貝和淺拷貝
s1.teacher == s2.teacher 淺拷貝
s1.teacher != s2.teacher 深拷貝
想深拷貝避免不了要使用物件的序列化和反序列化技術,所以:
所有物件至少要實現serializiable
需要拷貝的物件還要實現cloneable,如下:
public object clone()
throws clonenotsupportedexception
finally
retturn null;
}public
static
void
safeclose
(closeable closeable)
}catch
(ioexception e)
}
補充:
可能有的需要將上述clone函式單獨提取出來,將object傳入,那麼就要注意objectinputstream需要防止外部不可信的資料入侵,可以新建safeobjectinputstream類如下:
public
class
safeobjectinputstream
extends
objectinputstream
protected
safeobjectinputstream()
throws ioexception, securityexception
@override
protected class<
?>
resolveclass
(objectstreamclass objectstreamclass)
throws ioexception, classnotfoundexception
throw
newclassnotfoundexception
(objectstreamclass.
getname()
+" not find");
}}
淺拷貝 深拷貝和淺賦值 深賦值
include includeusing namespace std class string else 淺拷貝 也就是系統預設的拷貝,可寫可不寫。string const string s 預設的拷貝構造 深拷貝 string const string s string s2 s1 深賦值 str...
賦值 淺拷貝 深拷貝
堆是動態分配記憶體,記憶體大小不一 棧是自動分配相對固定大小的記憶體空間,並由系統自動釋放 基本資料型別值是不可變的,比較是值的比較 基本資料型別,傳值。開闢乙個新的記憶體空間 js 基本資料型別,儲存在 棧 中,記憶體可以及時 引用型別值是可變的,比較是引用的比較,看其引用是否指向同乙個物件 引用...
賦值 淺拷貝 深拷貝
什麼是深拷貝 使用json.parse json.stringify 是深拷貝 原理是josn物件中的stringify可以把乙個js物件序列化為乙個json字串,parse可以把json字串反序列化為乙個js物件,通過這兩個方法,也可以實現物件的深複製。但是這個方法不能夠拷貝函式。缺點 1 如果物...