Java中除了基本类型int,char,double等的赋值是按照值传递之外,其余的类型和对象都是按照引用进行传递的。

  下面来看一个关于引用的例子。

  

package referenceCopy;
// 一个文件中允许有多个类,但是public类型的类只能有一个
class Basic {
private int aInt = 0;
public int getAInt() {
return aInt;
}
public void setAInt(int int1) {
aInt =int1;
}
public void changeInt() {
this.aInt = 1;
}
}
public class Children {
// int char double 等基本类型都是按照值传递的,
// 除此之外的其他类型都是按照引用进行传递的。
public static void main(String[] args) {
// TODO Auto-generated method stub
Basic b = new Basic();
Basic a = b;
b.changeInt();
System.out.println(b.getAInt());
System.out.println(a.getAInt());
}

}

输出的结果为1,1

究其原因是a和b的指向同一个引用。

那么如何变成两个引用呢,我们提出了浅复制和深复制。

首先我们来看浅复制

package referenceCopy;

import java.util.Date;
// 一个文件中允许有多个类,但是public类型的类只能有一个
class BasicA implements Cloneable{
private int aInt = 0;

private Date birth = new Date();

public Date getBirth() {
return birth;
}
public void setBirth(Date birth) {
this.birth = birth;
}
public void changeBirth() {
this.birth.setMonth(1);
}
public int getAInt() {
return aInt;
}
public void setAInt(int int1) {
aInt =int1;
}
public void changeInt() {
this.aInt = 1;
}
// 改写clone方法
public Object clone() {
Object o = null;
try {
o = (BasicA)super.clone();
} catch (Exception e) {
e.printStackTrace();
}
return o;
}
}
public class WeakChildrenReferneceCopy {
// int char double 等基本类型都是按照值传递的,
// 除此之外的其他类型都是按照引用进行传递的。
// 相对于Children类,该类采用了浅复制的方法来进行复制。
// 基本的数据类型变量已经全部复制了进来,但是具体对象的改变并未改变
public static void main(String[] args) {
BasicA b = new BasicA();
BasicA a = (BasicA)b.clone();
b.changeInt();
b.changeBirth();
// 由此可见,浅复制只复制了简单的数据类型,
// 对于复杂的数据类型并未进行复制
System.out.println(a.getAInt());
System.out.println(b.getAInt());
System.out.println(b.getBirth());
System.out.println(a.getBirth());
}

}

输出的结果如下所示:

0

1
Mon Feb 06 14:45:47 CST 2017
Mon Feb 06 14:45:47 CST 2017

由结果可以看出,浅复制并未改变其他对象的引用。

由此,我们提出了深复制

package referenceCopy;

import java.util.Date;
//一个文件中允许有多个类,但是public类型的类只能有一个
class BasicB implements Cloneable{
private int aInt = 0;

private Date birth = new Date();

public Date getBirth() {
return birth;
}
public void setBirth(Date birth) {
this.birth = birth;
}
public void changeBirth() {
this.birth.setMonth(1);
}
public int getAInt() {
return aInt;
}
public void setAInt(int int1) {
aInt =int1;
}
public void changeInt() {
this.aInt = 1;
}
// 改写clone方法
public Object clone() {
// 强复制需要将返回的复制对象改变为自己需要的对象
BasicB o = null;
try {
o = (BasicB)super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
o.birth = (Date)this.getBirth().clone();
return o;
}
}
public class StrongChildrenReferenceCopy {
public static void main(String[] args) {
BasicB a = new BasicB();
BasicB b = (BasicB) a.clone();
b.changeInt();
b.changeBirth();
System.out.println(a.getAInt());
System.out.println(b.getAInt());
System.out.println(a.getBirth());
System.out.println(b.getBirth());
}

}

运行结果如下:

0
1
Thu Jul 06 14:55:13 CST 2017
Mon Feb 06 14:55:13 CST 2017

由上处进行了标红的地方可以看出两者在进行复制时的不同之处。

浅复制:被复制的对象的所有 变量都含有与原来对象相同的值,而所有对其他对象的引用仍然指向原来对象相同的值。换言之,浅复制只复制自己考虑的对象,未复制它所引用的对象。

深复制:被复制对象的所有变量都含有与原来对象相同的值,除去那些引用其他对象的变量。那些引用其他对象的变量将指向被复制的新对象,而不是原有的那些被引用的对象,换言之,深复制把复制对象 所引用的对象都复制了一遍。

Java中引用的浅复制和深复制的更多相关文章

  1. JAVA中浅复制与深复制 - coolmist - ITeye技术网站

    body{ font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI& ...

  2. JAVA中浅复制与深复制

    1.浅复制与深复制概念⑴浅复制(浅克隆)被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象. ⑵深复 ...

  3. Java中的“浅复制”与“深复制”

    复制 将一个对象的引用复制给另一个对象,一共有三种方式.第一种方式是直接赋值,第二种方式是浅复制,第三种方式是深复制. 1.直接赋值 在Java中,A a1 = a2,这实际上复制的是引用,也就是说 ...

  4. java基础-浅复制与深复制的理解

    浅复制与深复制在很多编程语言中都有出现,那么什么是浅复制,什么是深复制呢? 要区分浅复制与深复制,首先我们要明确什么是复制,怎样才算是复制.复制的例子在生活中也随处可见,如复印一份文档,复制一段文字等 ...

  5. Java里的浅复制与深复制

    1.浅复制与深复制概念 ⑴浅复制(浅克隆) 被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换言之,浅复制仅仅复制所考虑的对象,而不 复制它所引用的对象. ...

  6. 深度解析javascript中的浅复制和深复制

    原文:深度解析javascript中的浅复制和深复制 在谈javascript的浅复制和深复制之前,我们有必要在来讨论下js的数据类型.我们都知道有Number,Boolean,String,Null ...

  7. js中的浅复制和深复制

    浅复制:浅复制是复制引用,复制后的引用都是指向同一个对象的实例,彼此之间的操作会互相影响 深复制:深复制不是简单的复制引用,而是在堆中重新分配内存,并且把源对象实例的所有属性都进行新建复制,以保证深复 ...

  8. Python中的浅复制、深复制

    参考 https://docs.python.org/3/library/copy.html?highlight=copy%20copy#copy.copy https://en.wikipedia. ...

  9. php对象复制、clone、浅复制与深复制实例详解

    php对象复制.clone.浅复制与深复制实例详解 一.用clone(克隆)来复制对象$obj1 = new Object();$obj2 = clone $obj1;clone方法会触发对象里定义的 ...

随机推荐

  1. 如何升级php版本---从php5.5.12 升级php7.1.5 wamp实践

    1.从官网下载一个php7.1.5 2.将刚下载的压缩包解压缩,修改命名为php7.1.5,即php+版本号. 3.将这个文件夹放在wamp/bin/php 目录下. 4.将原来版本的php5.5.1 ...

  2. JSP servlet的配置与使用

    1. servlet 的配置文件内容如下所示 <servlet>     <description>This is the description of my J2EE com ...

  3. C#总结(三)DataGridView增加全选列

    最近的一个winform的项目中,碰到datagridview控件的第一列添加全选的功能,通常这个功能,有两种实现方式:1. 为控件添加DataGridViewCheckBoxColumn来实现,但是 ...

  4. Python进阶 - 对象,名字以及绑定

    Python进阶 - 对象,名字以及绑定 1.一切皆对象 Python哲学: Python中一切皆对象 1.1 数据模型-对象,值以及类型 对象是Python对数据的抽象.Python程序中所有的数据 ...

  5. MyBatis通用Mapper开发

    通常情况下,MyBatis 的增删改查操作需要自己在相应xml中写相关语句, 但是运用相关工具,其实可以很方便的自动生成单表的所有增删改查(通用的多表联合查询还是需要自己写). 也可以根据具体环境,设 ...

  6. IT培训行业揭秘(六)

    2017年全国的IT职业培训机构的招生数量相比于去年同期都出现了大规模的下滑,虽然目前大学生毕业之后参加培训班的人数依然没有变化,但是目前中小培训机构像雨后春笋般的纷纷建立,他们纷纷抢占市场,为了招生 ...

  7. Js实现京东无延迟菜单效果(demo)

    一个端午节,外面人山人海,又那么热,我认为宅在家里看看慕课网,充实自己来的实际... 这是一个js实现京东无延迟菜单效果,感觉很好,分享给大家... 1.开发基本的菜单结构 2.开发普通的二级菜单效果 ...

  8. HttpClien Get&Post

    新公司上班第二周,开始进军.Net Core,这方面的东西比较新,所以已经封装好的东西比较少,比如HttpClien之类的开源类库,找了NuGet好久,没有找到,所以先写个简陋的来用着先. 引用: u ...

  9. 今天重装系统后,Wdows更新提示“windows update当前无法检查更新,因为未运行服务。您可能需要重新启动计算机”

    到百度搜了常用的解决方法,就是用命令提示符,但对我的情况不管用,提示“拒绝访问”.后来在08绿软站的一篇文章中找到了解决办法.原文如下(我本人也是用的第四种方法解决的): 试了下面几种解决方法,第四种 ...

  10. VR全景:实体店与互联网的完美结合

    VR元年已过,VR项目.VR创业潮转为理性,VR行业分为两个方向:硬件和内容.硬件又分为VR头显和辅助设备,内容又分为VR全景和VR虚拟内容,如游戏.娱乐.根据行业划分为VR+购物,VR+教育,VR+ ...