原型模式 java 深淺_JAVA設計模式---原型模式--淺客隆和深克隆

JAVA淺克隆和深克隆

淺克隆:被復制對象的所有變量和原來相同,而所有的對其他對象的引用仍指向原對象。即如果復制的對象修改復制對象的變量,原對象不會改變。而修改引用的對象,二者均會發生改變。

深復制(克隆):被復制對象的所有變量都含有與原來的對象相同的值,除去那些引用其他對象的變量。那些引用其他對象的變量將指向被復制過來的新對象,而不再是原有的那些被引用的對象。深克隆就是把所有對象多復制了一遍。

public class Student implements Cloneable,Serializable {

private String name;

private int age;

private Teacher teacher;

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

public Teacher getTeacher() {

return teacher;

}

public void setTeacher(Teacher teacher) {

this.teacher = teacher;

}

//淺復制

public Object clone(){

Object obj = null;

try {

obj = super.clone();

} catch (CloneNotSupportedException e) {

e.printStackTrace();

return null;

}

return obj;

}

/* 深復制 */

public Object deepClone() throws IOException, ClassNotFoundException {

/* 寫入當前對象的二進制流 */

ByteArrayOutputStream bos = new ByteArrayOutputStream();

ObjectOutputStream oos = new ObjectOutputStream(bos);

oos.writeObject(this);

/* 讀出二進制流產生的新對象 */

ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());

ObjectInputStream ois = new ObjectInputStream(bis);

return ois.readObject();

}

}

public class Teacher implements Serializable{

private String tName;

public Teacher() {

super();

}

public Teacher(String tName) {

super();

this.tName = tName;

}

public String gettName() {

return tName;

}

public void settName(String tName) {

this.tName = tName;

}

}

import java.io.IOException;

public class Test {

/**

* @param args

*/

public static void main(String[] args) throws ClassNotFoundException, IOException {

Student stu = new Student();

stu.setAge(22);

stu.setName("stu1");

stu.setTeacher(new Teacher("Tea1"));

Student stu1 = (Student) stu.clone();

//淺復制

stu1.getTeacher().settName("tea2");

stu1.setAge(23);

System.out.println(stu1.getTeacher().gettName()+"? "+stu.getTeacher().gettName());

System.out.println(stu1.getAge()+"? "+stu.getAge());

}

}

//淺復制

stu1.getTeacher().gettName()的值和stu.getTeacher().gettName()相同,被修改之后的值

stu1.getAge()的值和stu.getAge()的值不同,前者為23,后者為22

//深復制

Student stu2 = (Student) stu.deepClone();

stu2.getTeacher().settName("tea3");

stu2.setAge(23);

System.out.println(stu2.getAge()+” ”+stu.getAge());

System.out.println(stu2.getTeacher().gettName()+"? "+stu.getTeacher().gettName());

stu2.getAge()的值和stu.getAge()的值不同,前者為23,后者為22

stu2.getTeacher().getName()的值和stu.getTeacher().getName()的的值不同,前者為tea3,后者為tea1

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/257543.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/257543.shtml
英文地址,請注明出處:http://en.pswp.cn/news/257543.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SocketErrorCode:10022

在編寫.net的網絡服務器時,我使用了裸socket來實現。在windows上,或者在linux上通過.net core來跑時都沒有什么問題,但是通過mono運行調用socket.Bind()時卻總是報ErrorCode為10022的SocketException,表示參數無效。通過命令netst…

request.RequestContextListener

由于是使用spring mvc來做項目&#xff0c;因此脫離了HttpServletRequest作為參數&#xff0c;不能夠直接使用request&#xff0c;要想使用request可以使用下面的方法&#xff1a; 在web點xml中配置一個監聽 [html] view plaincopyprint?<listener> <listen…

poj1741 Tree 點分治

入門題&#xff0c;算是對樹分治有了初步的理解吧。 #include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> #include<vector> #define REP(i,a,b) for(int ia;i<b;i) #define MS0(a) memset(…

深入理解 ajax_xhr 對象

2019獨角獸企業重金招聘Python工程師標準>>> ajax技術的核心是XMLHttpRequest對象(簡稱XHR)&#xff0c;這是由微軟首先引入的一個特性&#xff0c;其他瀏覽器提供商后來都提供了相同的實現。 IE5是第一款引入XHR對象的瀏覽器。在IE5中&#xff0c;XHR對象是通過MSX…

POJ 1584 A Round Peg in a Ground Hole(點到直線距離,圓與多邊形相交,多邊形是否為凸)...

題意&#xff1a;給出一個多邊形和一個圓&#xff0c;問是否是凸多邊形&#xff0c;若是則再問圓是否在凸多邊形內部。 分3步&#xff1a; 1、判斷是否是凸多邊形 2、判斷點是否在多邊形內部 3、判斷點到各邊的距離是否大于等于半徑 上代碼&#xff1a; #include <iostream&…

組函數及分組統計

分組函數 SQL中經常使用的分組函數 Count(): 計數 Max()&#xff1a;求最大值 Min()&#xff1a;求最小值 Avg()&#xff1a;求平均值 Sum()&#xff1a;求和 -- 統計emp表中的人數 select count(*) from emp; -- 統計獲得獎金的人數 select count(comm) from emp;-- 求全部雇…

java數據生成excel_Java 數據庫數據生成Excel

采用jxl.jar生成Excel項目開發注意事項&#xff1a; 1:導入從網上下載的jar包&#xff1a;mail.jar 和 activation.jar2:刪掉C:\Program Files\MyEclipse\Common\plugins\com.genuitec.eclipse.j2eedt.core_10.0.0.me201110301321\data\libraryset\EE_5 下 javaee.jar中的java…

兩張神圖介紹python3和 2.x與 3.x 的區別

有感與第一張圖, 做了第二張圖.轉載于:https://www.cnblogs.com/Vito2008/p/5280393.html

Java-jdbc連接數據庫

1、Oracle8/8i/9i數據庫&#xff08;thin模式&#xff09; Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); String url"jdbc:oracle:thin:localhost:1521:orcl"; //orcl為數據庫的SID String user"test"; String…

abstract class 和 interface 區別

本文出自與&#xff1a;heipai:tsg666含有 abstract 修飾符的 class 即為抽象類&#xff0c;abstract 類不能創建的實例對象。含有 abstract 方法的類必須定義為 abstract class&#xff0c;abstract class 類中的方法不必是抽象的。abstract class 類中定義抽象方法必須在具體…

Factorial Trailing Zeroes

https://leetcode.com/problems/factorial-trailing-zeroes/ Given an integer n, return the number of trailing zeroes in n!. Note: Your solution should be in logarithmic time complexity. 解題思路&#xff1a; 再次遇見最討厭的Math題。 開始的思路&#xff0c;結尾的…

java設計模式懶漢_java設計模式-懶漢設計模式

一、理論類加載時&#xff0c;不進行實例化&#xff0c;調用時才進行類的實例化。二、代碼實現public class LazyManPattern {//1.構造方法私有化private LazyManPattern(){}//2.類加載時&#xff0c;不進行實例化private static LazyManPattern lazyManPattern;//3.創建實例化…

多視圖參數傳遞

在iOS開發中常用的參數傳遞有以下幾種方法&#xff1a; 采用代理模式 采用iOS消息機制 通過NSDefault存儲&#xff08;或者文件、數據庫存儲等&#xff09; 通過AppDelegate定義全局變量&#xff08;或者使用UIApplication、定義一個單例類等&#xff09; 通過控制器屬性傳遞轉…

百年難得一見!阿里園區驚現雙月爭輝奇觀!

9月3日晚杭州阿里園區上空突然驚現“雙月爭輝”奇觀&#xff0c;引發路人、員工爭相拍照留念狂潮。記者隨后深入園區探訪&#xff0c;近距離觀察“雙月奇觀”。當晚&#xff0c;熱心觀眾王先生提供線索。王先生路過杭州阿里巴巴園區時&#xff0c;聽到有人呼喊&#xff1a;“快…

Math源碼java_深入學習java源碼之Math.sin()與 Math.sqrt()

深入學習java源碼之Math.sin()與 Math.sqrt()native關鍵字凡是一種語言&#xff0c;都希望是純。比如解決某一個方案都喜歡就單單這個語言來寫即可。Java平臺有個用戶和本地C代碼進行互操作的API&#xff0c;稱為JNInative關鍵字告訴編譯器(其實是JVM)調用的是該方法在外部定義…

路由控制器Express的路由控制方法

MVC中的C控制器 express的路由控制方法&#xff1a;1.創建路由規則 var express require(‘express’); var router express.Router(); /* get home page.*/ router.get(/, function(req,res){ res.render(index, title:express); }); module.exports router; 服務器在開始…

URAL 1146 Maximum Sum(最大子矩陣的和 DP)

Maximum Sum 大意&#xff1a;給你一個n*n的矩陣&#xff0c;求最大的子矩陣的和是多少。 思路&#xff1a;最開始我想的是預處理矩陣&#xff0c;遍歷子矩陣的端點&#xff0c;發現復雜度是O(n^4)。就不知道該怎么辦了。問了一下&#xff0c;是壓縮矩陣&#xff0c;轉換成最大…

基于 axios 的 Vue 項目 http 請求優化

對于需要大量使用 http 請求的項目&#xff0c;我們通常會選擇對 http 請求的方法進行二次封裝&#xff0c;以便增加統一的攔截器&#xff0c;或者統一處理阻止重復提交之類的邏輯。Vue.js 的項目中我們選擇使用了 axios 這樣一個 http 庫&#xff0c;下面也就簡述下基于 axios…

Spring 事務配置5種方式

Spring配置文件中關于事務配置總是由三個組成部分&#xff0c;分別是DataSource、TransactionManager和代理機制這三部分&#xff0c;無論哪種配置方式&#xff0c;一般變化的只是代理機制這部分。 DataSource、TransactionManager這兩部分只是會根據數據訪問方式有所變化&…

java中主線程首先執行_java經典面試題:子線程先運行30次主線程,主線程40次,如此循環50次?...

最近偶遇這道題&#xff0c;網上相似的題都是循環次數不一樣。然而我百度搜到的論壇或者博客感覺都不太對&#xff0c;運行有穿插。請給出正確結果。我們假使所有人都引入了業務對象。并且我有疑問&#xff1f;感覺題目本意不是new Thread()放在前面。網上有人做法是用標志位防…