码迷,mamicode.com
首页 > 编程语言 > 详细

【java】克隆clone()方法和相等equals()方法的重写

时间:2017-05-02 19:37:53      阅读:271      评论:0      收藏:0      [点我收藏+]

标签:util   nbu   set   空间   规范   time   nts   地址   hash   

1、为什么要重写clone()方法?

Java中的浅度复制是不会把要复制的那个对象的引用对象重新开辟一个新的引用空间,当我们需要深度复制的时候,这个时候我们就要重写clone()方法。

 

2、equals()和clone()方法重载的示例

Hourse类:

import java.util.Date;

public class House implements Cloneable {
     
        private int id;
        private double area;
        private Date whenBulit;
        House(){
        }
        House(int newId,double newArea){
            id = newId;
            area = newArea;
            whenBulit = new Date();
        }
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public void setArea(double area) {
            this.area = area;
        } 
        public void setWhenBulit(long whenBulit) {
           this.whenBulit.setTime(whenBulit) ;
        }    
        public double getArea() {
            return area;
        }
        public Date getWhenBulit() {
            return whenBulit;
        }
        public long getWhenBulitTime() {
            return whenBulit.getTime();
        }
       //重写equals方法,因为我们要对比的是date类中的时间而不是对象的引用地址
        public boolean equals(House obj){
            //obj.getArea()==this.getArea()
            //obj.getId()==this.getId();
            //obj.getWhenBuildTime==this.getWhenBuildTime()
            if(obj.getArea()==this.getArea()&&obj.getId()==this.getId()&&obj.getWhenBulitTime()==this.getWhenBulitTime())
              return true;
            else
            {
                return false;
            }
        }
        //如果重载了equals方法,按照规范也应该重载hashCode(),这里只是简单了将hashCode和传入的id关联起来
        @Override
        public int hashCode(){
            return getId();
        }
        public Object clone() throws CloneNotSupportedException{
            //构造一个对象 house,并且使用id和area
            House house = new House(this.getId(),this.getArea());
            //调用对象中的setWhenBuild方法,使用getTime()可以获得一个毫秒数。
            house.setWhenBulit(this.getWhenBulit().getTime()) ;
            return house ;
        }
    }

 

Testor类:

public class Testor {
     public static void main(String[] args ) throws CloneNotSupportedException{
            House h1 = new House(1,200.0);
            House h2 = (House)h1.clone();
            
            System.out.println(h1==h2);
            
            System.out.println(h1.equals(h2));
            
            System.out.println(h1.getWhenBulit()== h2.getWhenBulit());
            
            System.out.println(h1.getWhenBulit().equals(h2.getWhenBulit()));
        }
}

3、API中clone()方法介绍的疑惑

在API1.6中看见这样一句话:

般情况下:

    x.clone().equals(x)

为 true,但这并非必须要满足的要求。

这里需要注意,如果我们这样调用代码测试:

public class TestClone implements Cloneable {

    public static void main(String []args) throws CloneNotSupportedException{
        TestClone tc=new TestClone();
        try{
        Object obj=tc.clone();
        System.out.println(obj==tc);//结果是false
        System.out.println(obj.equals(tc));//结果是false
        }catch(Exception e){
            System.out.println("Exception:"+e.getMessage());
        }
    }
}

那么结果就是false。因为equals默认条件是比较变量中引用地址的值,API上的意思是如果我们需要使用Clone()方法,那么在重载的时候一般情况下应该在重写equals()方法,不需要比较对象的引用,只需要将重写的代码写为比较对象的值就符合了。

 

【java】克隆clone()方法和相等equals()方法的重写

标签:util   nbu   set   空间   规范   time   nts   地址   hash   

原文地址:http://www.cnblogs.com/HDK2016/p/6797593.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!