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

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