对于基本数据类型而言,即如下八种基本数据类型,int,boolean,char,byte,short,float,double,long。

 public class test
{
public static void main(String[] args)
{
int a=3;
int b=a;
int c=3;
b=2;
System.out.println("a: "+a);
System.out.println("b: "+b);
System.out.println(a==b);
System.out.println(a==c); }
}

说明:对于基本数据类型,==只是比较两个变量的值,并没有比较其地址,并且其变量复制后,任意改变其中一个变量时,并没有对另一个变量产生变化,默认实现的是深拷贝。

一个简单的浅拷贝示例,浅拷贝中复制出来的对象的域与原始对象的域使用相同的对象引用,指向的是同一个对象,相当于在两个对象中对同一个对象进行处理,会产生潜在的问题。

Object类的clone方法复制对象的做法是对当前对象中所有实例域进行逐一复制。先创建一个新的对象,再把新对象中所有的实例域的值初始化成原始对象中对应域的当前值。


 class ToBeCloned implements Cloneable//Cloneable为标记接口,其内不包含任何方法,要实现此接口的话,必须重写clone方法,否则
//抛出异常java.lang.CloneNotSupportedException异常
{
private int value=0;
public void setValue(int value)
{
this.value=value;
}
public int getValue()
{
return this.value;
}
public Object clone()
{
try
{
return super.clone();
}
catch(CloneNotSupportedException e)
{
throw new Error(e);
}
}
} public class SimpleClone
{
public static void main(String[] args)
{
ToBeCloned obj=new ToBeCloned();
obj.setValue(1);
ToBeCloned cloneObj=(ToBeCloned)obj.clone(); System.out.println("cloneObj.getValue(): "+cloneObj.getValue());
System.out.println("obj.getValue(): "+obj.getValue());
obj.setValue(2);
System.out.println("cloneObj.getValue(): "+cloneObj.getValue());
System.out.println("obj.getValue(): "+obj.getValue());
}
}


如果对象中只包含值为基本类型或不可变对象的域,用上面的方法就可以了,内部域为基本数据类型。但是当对象中某些域的值为可变对象时,上述方法就不能满足了。示例如下:

 class Counter
{
private int value=0;
public void increase()
{
value++;
}
public int getValue()
{
return value;
}
} class MutableObject implements Cloneable
{
private Counter counter=new Counter();
public void increase()
{
counter.increase();
}
public int getValue()
{
return counter.getValue();
}
public Object clone()
{
try
{
return super.clone();
}
catch(CloneNotSupportedException e)
{
throw new Error(e);
}
}
} public class MutableObjectClone
{
public static void main(String[] args)
{
MutableObject obj=new MutableObject();
obj.increase();
MutableObject clonedObj=(MutableObject)obj.clone();
clonedObj.increase();
obj.increase();
System.out.println(clonedObj.getValue());
System.out.println(obj.getValue());
}
}

这说明Object类的clone方法已经对类中的基本类型和不可变对象的域进行了处理,只要在这基础上添加对可变对象的域的处理即可。即通过递归的方式来对clone进行修改。

因为在Counter中value为int类型,故递归截止为此函数。

 class Counter implements Cloneable
{
private int value=0;
public void increase()
{
value++;
}
public int getValue()
{
return value;
}
public Object clone()
{
try
{
return super.clone();
}
catch(CloneNotSupportedException e)
{
throw new Error(e);
}
}
} class MutableObject implements Cloneable
{
private Counter counter=new Counter();
public void increase()
{
counter.increase();
}
public int getValue()
{
return counter.getValue();
}
public Object clone()
{
MutableObject obj;
try
{
obj=(MutableObject)super.clone();
obj.counter=(Counter)counter.clone();
return obj;
}
catch(CloneNotSupportedException e)
{
throw new Error(e);
}
}
} public class MutableObjectClone
{
public static void main(String[] args)
{
MutableObject obj=new MutableObject();
obj.increase();
MutableObject clonedObj=(MutableObject)obj.clone();
clonedObj.increase();
obj.increase();
obj.increase();
System.out.println("clonedObj.getValue(): "+clonedObj.getValue());
System.out.println("obj.getValue(): "+obj.getValue());
}
}

在这里要注意在类Object中,clone()方法是protected权限的。

进行复制对象的另外一个做法是使用复制构造方法,即用一个已有 的对象去构造另外一个对象。

示例如下:

 public class UserException
{
private String name;
private String email; public User(String name,String email)
{
this.name=name;
this.email=email;
}
public User(User user)
{
this.name=user.getName();
this.email=user.getEmail();
} public String getName()
{
return this.name;
}
public String getEmail()
{
return this.email;
}
}

(原)java中对象复制、==、equals的更多相关文章

  1. Java中对象的深复制和浅复制详解

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

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

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

  3. JAVA中浅复制与深复制

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

  4. 深入分析Java中的 == 和equals

    关于Java中的 == 和equals的解释请看这位博主的文章 :http://www.cnblogs.com/dolphin0520/p/3592500.html 以下是我对这篇文章的一些扩展. 对 ...

  5. 2)Java中的==和equals

    Java中的==和equals   1.如果比较对象是值变量:只用==   2.如果比较对象是引用型变量:      ==:比较两个引用是不是指向同一个对象实例.      equals:       ...

  6. java中的==和equals的区别

    关于JAVA中的==和equals函数的区别 今天在研读Thinking in java 时注意到==和equals的区别,于是就通过查看JDK_API才读懂了他们的区别,于是将心得分享一下,望批评指 ...

  7. java中数组复制的两种方式

    在java中数组复制有两种方式: 一:System.arraycopy(原数组,开始copy的下标,存放copy内容的数组,开始存放的下标,需要copy的长度); 这个方法需要先创建一个空的存放cop ...

  8. java中的==、equals()、hashCode()源码分析(转载)

    在java编程或者面试中经常会遇到 == .equals()的比较.自己看了看源码,结合实际的编程总结一下. 1. ==  java中的==是比较两个对象在JVM中的地址.比较好理解.看下面的代码: ...

  9. java中的==、equals()、hashCode()

    java中的==.equals().hashCode()源码分析 在java编程或者面试中经常会遇到 == .equals()的比较.自己看了看源码,结合实际的编程总结一下. 1. ==  java中 ...

随机推荐

  1. C/C++ 常用工具集

    1. c++filt  //注意:就是这个名字 "c++file". 能把c++的函数签名转换成代码形参格式: 如:# c++filt _ZNSt4priv17_Rb_tree_i ...

  2. Android 属性动画(Property Animation) 完全解析 (上)

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38067475 1.概述 Android提 供了几种动画类型:View Anima ...

  3. 【转】【WPF】 WPF 调用API修改窗体风格实现真正的无边框窗体

    WPF中设置无边框窗体似乎是要将WindowStyle设置为None,AllowTransparency=true,这样才能达到WinForm中无边框窗体的样式.但是AllowTransparency ...

  4. VSFTPD配置TLS/SSL

    今天在OSX上配置Coda2 + Xampp的时候,发现FTP老是不连接到服务器上面,导致每次更改了文件都需要使用scp命令上传到服务器.如果一个文件还好,文件和文件夹一多就得使用rp参数全部提交,再 ...

  5. 待整理-coredump

    Linux下如何产生coredump(gdb调试用) 任务发生异常,需要记录遗言信息,利用gdb调试,因此需要记录coredump文件.设置查看:在root用户下执行sysctl -a | grep ...

  6. Tomcat6 一些调优设置内存和连接数

    Tomcat6 一些调优设置内存和连接数 博客分类: java TomcatJVMLinux应用服务器网络应用  公司的一个服务器使用Tomcat6默认配置,在后台一阵全点击服务器就报废了,查了一下就 ...

  7. Linux操作系统基础(完结)

    摘要 一.Linux操作系统概述 二.Linux操作系统安装 三.Linux文件系统及文件基础 四.Linux操作系统命令使用基础 五.Linux应用程序的安装与卸载基础 五.用户及进程 六.相关信息 ...

  8. MJExtension的使用:https://github.com/CoderMJLee/MJExtension

    MJExtension能做什么? MJExtension是一套字典和模型之间互相转换的超轻量级框架 MJExtension能完成的功能 字典(JSON) --> 模型(Model) 模型(Mod ...

  9. 点击事件touches与ios的手势UIGestureRecognizer

    .h文件 @property (weak,nonatomic) IBOutlet UILabel *messageLabel;@property (weak,nonatomic) IBOutlet U ...

  10. 重写TiledServiceLayer实现Arcgis访问Mapabc地图服务 (转载)

    package com.baixin.main;/** *  * @ClassName:   MapAbcToArcGISTLayer * @Description:    ArcGIS访问MapAb ...