原型模式 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.mzph.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()放在前面。网上有人做法是用标志位防…