读书人

用==跟equals测试java对象的引用、浅拷

发布时间: 2012-11-05 09:35:12 作者: rapoo

用==和equals测试java对象的引用、浅拷贝、深拷贝和初始化区别

测试主要部分代码:public class Employee implements Cloneable,
???????????????????????????????? Comparable,
???????????????????????????????? Serializable{
??? private String name;
?? private double payRate;
?? private int[] days;

?public void displayDays(){? //显示数组
??? ??? for(int i=0;i<5;i++)
??? ??? System.out.println(this.days[i]);
??? }
??? public void setDays(int i,int day){//设置数组
??? ??? days[i]=day;
??? }
public Object cloneLight() throws CloneNotSupportedException //浅拷贝方法
?? {?
?? return super.clone();? //can use this to light copy
? }?

?
? public Object clone()throws CloneNotSupportedException {//深拷贝方法
???
???? return new Employee (name, payRate, days);
???? /*可以将属性传入,因构造函数执行了,属性初始化了deep copy
????? 或者使用:
????????? Employee e1=(Employee)super.clone();
????????? e1.days=days;//若为对象则e1.o1=(O1)o1.clone();
????????? rerurn e1;
???? */
?? }
/*其它设置方法略*/
?public static void main(String[] args){
?Employee emp1;
?Employee emp2=new Employee(实参1,实参2,实参3);//根据构造方法传入,此处略

try{
?????? //emp1=emp2;//引用的测试
?????? // emp1 = (Employee)emp2.cloneLight();//浅拷贝的测试
??? ??? ?emp1 = (Employee)emp2.clone();//深拷贝的测试
???? }
???? catch(Exception e){
??? ??? ?e.printStackTrace();
???? }
???? emp1.setDays(0,11);//重新设置
????? System.out.println("Equals: " + emp1.equals(emp2));
????? System.out.println("emp1's days array is:");
????? emp1.displayDays();
????? System.out.println("emp2's days array is:");
????? emp2.displayDays();
?? }
测试结果表明:
首先回顾上面所有的比较的==和equals的区别,==用于基本数据类型比较值,对象时同一个对象(来自同一个地址引用)才true;
euquals比较的是两者的值或者是否是同一个类的对象(而不管是否来自同一个地址引用)。
但是他们都不会去比较对象里面的数组或对象是否也相等。
1.引用赋值只是将一个相同的地址的值浅复制的传递给了另外一个变量或对象,故当用==时会相等。
2.对象引用和浅拷贝都没有拷贝原对象的数组和对象成员,但是浅拷贝与引用的不同是构造了另一个引用(而不是相同的引用),故当==时不等而equals时相等;即java Object clone()若不重传入实参,且原对象中只有基本类型成员时可以实现对象拷贝分离。
3.对象深拷贝与上述1的拷贝的区别就是,深拷贝连同原对象中的数组和对象成员(非基本类型)也一同拷贝了一份。
所以要使得两个对象维护自己的数据(而不是共享)则要用到深拷贝。
4.对象的构造,当然如果原对象的构造数据不复杂也可以从新声明一个对象来实现。

读书人网 >编程

热点推荐