图1 拷贝思维导图(点击查看图片)

1,拷贝

  有两个相同属性的对象A和B,A拥有初始化值,将其值拷贝到B中,使得B拥有与A“相同”数据的属性!注意这里的相同我有加双引号!

  相同可能表示这么几个意思:①数值相同【指向不同的内存空间】;②地址相同【指向相同的内存空间】;

  下面是直接使用"="进行复制的操作

 package com.cnblogs.mufasa.Demo1;

 import java.util.Date;

 class Person{//
private int age=0;
private Birth birth=new Birth();
private String name=""; public Person(int age, Birth birth, String name) {
this.age = age;
this.birth = birth;
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} public Birth getBirth() {
return birth;
} public void setBirth(Birth birth) {
this.birth = birth;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
}
public String toString(){
return "姓名:"+name+",年龄:"+age+",出生日期:"+birth.toString();
}
} class Birth{//生日
private String date="";
public Birth(){}
public Birth(String date){
this.date=date;
} public String getDate() {
return date;
} public void setDate(String date) {
this.date = date;
} @Override
public String toString() {
return this.date;
}
} public class Demo1 {//浅拷贝
public static void main(String[] args) {
Person p1=new Person(18,new Birth("19950729"),"万雨");
Person p2=p1;
System.out.println(p1.toString());
System.out.println(p2.toString()); p1.setAge(17);
p1.setBirth(new Birth("2018"));
p1.setName("Mufasa"); System.out.println(p1.toString());
System.out.println(p2.toString()); }
}
姓名:万雨,年龄:18,出生日期:19950729
姓名:万雨,年龄:18,出生日期:19950729
姓名:Mufasa,年龄:17,出生日期:2018
姓名:Mufasa,年龄:17,出生日期:2018

  其实就相当于对原始对象进行操作

2,浅拷贝

  Perosn类型对象有两个属性Age、name,将p1浅复制给p2

  基本类型直接进行数值复制,引用类型进行地址拷贝(String类型比较特殊,属于引用类型,但是它存在一个常量池需要进行特殊对待)

图2 浅拷贝

使用构造方法进行浅拷贝:

 package com.cnblogs.mufasa.Demo;

 import java.util.Date;

 class Person{//
private Age age;
private String name;
private int birth;
public Person(Age age, String name,int birth) {
this.age = age;
this.name = name;
this.birth = birth;
} public Person(Person p1){
this.age=p1.age;
this.name=p1.name;
this.birth=p1.birth;
} public int getAge() {
return this.age.getAge();
} public void setAge(int age) {
this.age.setAge(age); ;
} public void setAge(Age age) {
this.age = age;
} public int getBirth() {
return birth;
} public void setBirth(int birth) {
this.birth = birth;
} public String getName() {
return this.name;
} public void setName(String name) {
this.name = name;
}
public String toString(){
return "姓名:"+this.name+",年龄:"+this.age+",出生日期:"+this.birth;
}
} class Age{
private int age;
public Age(){}
public Age(int age){
this.age=age;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
}
public String toString(){
return this.age+"";
}
} public class Demo {//浅拷贝-构造方法实现
public static void main(String[] args) {
Person p1=new Person(new Age(18),"万雨",1995);
Person p2=new Person(p1);
System.out.println(p1.toString());
System.out.println(p2.toString()); p1.setAge(17);
p1.setBirth(2019);
p1.setName("Mufasa"); System.out.println(p1.toString());
System.out.println(p2.toString()); }
}

使用继承Cloneable接口调用clone方法进行浅拷贝

 package com.cnblogs.mufasa.Demo2;

 import java.util.Date;

 class Person implements Cloneable{//
private Age age;
private String name;
private int birth;
public Person(Age age, String name,int birth) {
this.age = age;
this.name = name;
this.birth = birth;
} public Person clone(){
Person obj=null;
try {
obj=(Person) super.clone();
}catch (CloneNotSupportedException e){
e.printStackTrace();
}
// obj.age=(Age) this.getAge().clone();
return obj;
} public Age getAge() {
return this.age;
} public void setAge(int age) {
this.age.setAge(age); ;
} public void setAge(Age age) {
this.age = age;
} public int getBirth() {
return birth;
} public void setBirth(int birth) {
this.birth = birth;
} public String getName() {
return this.name;
} public void setName(String name) {
this.name = name;
}
public String toString(){
return "姓名:"+this.name+",年龄:"+this.age+",出生日期:"+this.birth;
}
} class Age implements Cloneable{
private int age;
public Age(){}
public Age(int age){
this.age=age;
}
// public Age clone(){
// Age obj=null;
// try {
// obj=(Age) super.clone();
// }catch (CloneNotSupportedException e){
// e.printStackTrace();
// }
// return obj;
// } public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
}
public String toString(){
return this.age+"";
}
} public class Demo2 {//浅拷贝-继承Cloneable接口实现
public static void main(String[] args) {
Person p1=new Person(new Age(18),"万雨",1995);
Person p2=(Person)p1.clone();
System.out.println(p1.toString());
System.out.println(p2.toString()); p1.setAge(17);
p1.setBirth(2019);
p1.setName("Mufasa"); System.out.println(p1.toString());
System.out.println(p2.toString()); }
}
姓名:万雨,年龄:18,出生日期:1995
姓名:万雨,年龄:18,出生日期:1995
姓名:Mufasa,年龄:17,出生日期:2019
姓名:万雨,年龄:17,出生日期:1995

3,深拷贝

  引用类型数据也进行新内存开辟与幅值,

图3 深拷贝

使用继承Cloneable接口调用clone方法进行深拷贝【每个引用对象都需要使用clone方法进行拷贝】

 package com.cnblogs.mufasa.Demo2;

 import java.util.Date;

 class Person implements Cloneable{//
private Age age;
private String name;
private int birth;
public Person(Age age, String name,int birth) {
this.age = age;
this.name = name;
this.birth = birth;
} public Person clone(){
Person obj=null;
try {
obj=(Person) super.clone();
}catch (CloneNotSupportedException e){
e.printStackTrace();
}
obj.age=(Age) this.getAge().clone();
return obj;
} public Age getAge() {
return this.age;
} public void setAge(int age) {
this.age.setAge(age); ;
} public void setAge(Age age) {
this.age = age;
} public int getBirth() {
return birth;
} public void setBirth(int birth) {
this.birth = birth;
} public String getName() {
return this.name;
} public void setName(String name) {
this.name = name;
}
public String toString(){
return "姓名:"+this.name+",年龄:"+this.age+",出生日期:"+this.birth;
}
} class Age implements Cloneable{
private int age;
public Age(){}
public Age(int age){
this.age=age;
}
public Age clone(){
Age obj=null;
try {
obj=(Age) super.clone();
}catch (CloneNotSupportedException e){
e.printStackTrace();
}
return obj;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
}
public String toString(){
return this.age+"";
}
} public class Demo2 {//浅拷贝-继承Cloneable接口实现
public static void main(String[] args) {
Person p1=new Person(new Age(18),"万雨",1995);
Person p2=(Person)p1.clone();
System.out.println(p1.toString());
System.out.println(p2.toString()); p1.setAge(17);
p1.setBirth(2019);
p1.setName("Mufasa"); System.out.println(p1.toString());
System.out.println(p2.toString()); }
}

使用继承Serializable接口进行序列化与反序列化进行深拷贝【注意对象不能使用transient进行修饰,原因:transient修饰的对象无法进行序列化!】

 package com.cnblogs.mufasa.Demo3;

 import java.io.*;

 class Person implements Serializable{
private Age age;
private String name;
private int birth;
public Person(Age age, String name,int birth) {
this.age = age;
this.name = name;
this.birth = birth;
} public Age getAge() {
return this.age;
} public void setAge(int age) {
this.age.setAge(age); ;
} public void setAge(Age age) {
this.age = age;
} public int getBirth() {
return birth;
} public void setBirth(int birth) {
this.birth = birth;
} public String getName() {
return this.name;
} public void setName(String name) {
this.name = name;
}
public String toString(){
return "姓名:"+this.name+",年龄:"+this.age+",出生日期:"+this.birth;
}
} class Age implements Serializable {
private int age;
public Age(){}
public Age(int age){
this.age=age;
}
public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
}
public String toString(){
return this.age+"";
}
} public class Demo3 {//浅拷贝-继承Cloneable接口实现
public static void main(String[] args) throws IOException, ClassNotFoundException {
Person p1=new Person(new Age(18),"万雨",1995); ByteArrayOutputStream bos=new ByteArrayOutputStream();
ObjectOutputStream oos=new ObjectOutputStream(bos); oos.writeObject(p1);//1,先进行序列化
oos.flush();
ObjectInputStream ois=new ObjectInputStream(new ByteArrayInputStream(bos.toByteArray()));
Person p2=(Person)ois.readObject();//2,进行反序列化 System.out.println(p1.toString());
System.out.println(p2.toString()); p1.setAge(17);
p1.setBirth(2019);
p1.setName("Mufasa"); System.out.println(p1.toString());
System.out.println(p2.toString()); }
}
姓名:万雨,年龄:18,出生日期:1995
姓名:万雨,年龄:18,出生日期:1995
姓名:Mufasa,年龄:17,出生日期:2019
姓名:万雨,年龄:18,出生日期:1995

Java浅拷贝与深拷贝(思维导图)的更多相关文章

  1. [Java 并发] Java并发编程实践 思维导图 - 第一章 简单介绍

    阅读<Java并发编程实践>一书后整理的思维导图.

  2. [Java 并发] Java并发编程实践 思维导图 - 第二章 线程安全性

    依据<Java并发编程实践>一书整理的思维导图.

  3. [Java 并发] Java并发编程实践 思维导图 - 第四章 对象的组合

    依据<Java并发编程实践>一书整理的思维导图. 第一部分: 第二部分:

  4. 学习Java的9张思维导图

    转自:https://blog.csdn.net/aitaozi11/article/details/79652943 网上搜集了java的学习思维导图,分享给大家. 01.Java程序设计(基础) ...

  5. Java建造者模式(思维导图)

    图1 建造者模式[点击查看大图] 基本的知识点已在思维导图中,下面是demo 1,Builder 为创建一个产品对象的各个部件指定抽象接口 public interface PersonBuilder ...

  6. Java组合模式(思维导图)

    图1 组合模式[点击查看图片] 1,以公司职员为例的结构 package com.cnblogs.mufasa.demo3; import java.util.ArrayList; import ja ...

  7. Java门面模式(思维导图)

    图1 门面模式[点击查看图片] 1,实体对象类 package com.cnblogs.mufasa.demo1; //3个子系统,解决问题的实体 public class StoreA { //示意 ...

  8. Java Web学习过程的思维导图

    今天找文件,无意中翻到老师前段时间总结的知识点.觉得应该有点用处,所以分享给大家. 第一次在博客园发表,如有错误,还请指正.

  9. java编程思想-泛型思维导图

  10. java编程思想-并发思维导图

随机推荐

  1. 添加sql距离现在多久以前时间条件

    UNIX_TIMESTAMP(NOW())-UNIX_TIMESTAMP(add_time)<=25200 其中now()是现在时间 add_time是其他时间点  25200:是秒,现在和ad ...

  2. Linux 操作memcache命令行

    telnet 127.0.0.1 11211 连接 memcache stats 查看 memcache 状态 状态说明: pid memcache服务器的进程ID uptime 服务器已经运行的秒数 ...

  3. vue-cli项目模板的一些思考

    之前有个想法,就是要利用vue写一套ui.然后当时也没有搞清楚到底怎么写. 几经周转吧,通过付费的方式在gitbook上面找到了答案. 找到答案之后再看我们正在开发的项目,看伙伴写的代码,突然发现完全 ...

  4. 慎用array_filter函数

    array_filter (PHP 4 >= 4.0.6, PHP 5, PHP 7) array_filter - 用回调函数过滤数组中的单元 说明 array array_filter (  ...

  5. 自定义msi安装包的执行过程

    有时候我们需要在程序中执行另一个程序的安装,这就需要我们去自定义msi安装包的执行过程. 比如我要做一个安装管理程序,可以根据用户的选择安装不同的子产品.当用户选择了三个产品时,如果分别显示这三个产品 ...

  6. 如何屏蔽掉烦人的www.google-analytics.com

    有时候在开发的网站项目中会加载谷歌分析的js,并且加载的非常慢导致浏览器一直在转圈圈. 按下面的方法可屏蔽掉烦人的www.google-analytics.com   现在想只有屏蔽掉google-a ...

  7. lexicalized Parsing

    $q$(S $\rightarrow$ NP VP) * $q$(NP $\rightarrow$ NNP) * $q$(VP $\rightarrow$ VB NP) * $q$(NP $\righ ...

  8. Vue input 控件: 通过自定义指令(directive)使用正则表达式限制input控件的输入

    前言: 网站中的input输入框使用非常广泛,因业务场景不同需要对输入框做合法性校验或限制输入,比如电话号码.邮件.区号.身份证号等.input框的不合法内容主要有两种方式处理:1.用户输入内容后,通 ...

  9. SpringBoot: 17.热部署配置(转)

    spring为开发者提供了一个名为spring-boot-devtools的模块来使Spring Boot应用支持热部署,提高开发者的开发效率,无需手动重启Spring Boot应用. devtool ...

  10. Java实现汉诺塔移动,只需传一个int值(汉诺塔的阶)

    public class HNT { public static void main(String[] args) { HNT a1 = new HNT(); a1.lToR(10); //给汉诺塔a ...