用==跟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.对象的构造,当然
如果原对象的构造数据不复杂也可以从新声明一个对象来实现
。