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

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()方法,不需要比较对象的引用,只需要将重写的代码写为比较对象的值就符合了。

时间: 2024-08-05 15:01:06

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

java 数组的 toString 方法和 equals 方法以及 java.lang.Object 对象的 toString 方法和 equals 方法

1 public class Test { 2 public static void main(String[] args) { 3 int[] a = {1, 2, 4, 6}; 4 int[] b = a; 5 int[] c = {1, 2, 4, 6}; 6 7 //下面这个方法打印的是a数组的引用地址 8 System.out.println(a.toString()); 9 //下面这个方法比较的是两个数组的引用是否相等 10 System.out.println("a.equals

Java 中正确使用 hashCode 和 equals 方法

在这篇文章中,我将告诉大家我对hashCode和equals方法的理解.我将讨论他们的默认实现,以及如何正确的重写他们.我也将使用Apache Commons提供的工具包做一个实现. 目录: hashCode()和equals()的用法 重写默认实现 使用Apache Commons Lang包重写hashCode()和equals() 需要注意记住的事情 当使用ORM的时候特别要注意的 hashCode()和equals()定义在Object类中,这个类是所有java类的基类,所以所有的jav

Java中编写一个完美的equals方法

首先看下Java语言规范对equals方法的要求: 1,自反性,对于任何非控引用x,x.equals(x)都应该返回true. 2,对称性,对于任何引用x和y,如果x.equals(y)返回true,那么y.equals(x)也应该返回true. 3,传递性,如果x.equals(y),y.equals(z)都返回true,那么,x.equals(z)返回true. 4,一致性,如果x和y引用的对象没有发生变化,那么无论调用多少次x.equals(y)都返回相同的结果. 5,对于任意非空引用x,

JAVA 面向对象补充[toString方法和equals方法]

一.toString  方法 这里的toString  和 C#的To string 是两回事. JAVA中to string : Object类中都有一个to string() 方法,创建的每一个类都会继承这个方法,返回一个对象的String 表示. 代码: 注释代码后结果: 取消注释后结果: 二.equals方法

Java之hashCode的作用和equals方法的重构规则

这个是博主对hashcode的初步理解,以后加深了会再来更新: 1.hashcode是什么? hashcode是对象的散列码,不同的对象几乎不一样,说几乎是因为还是可以一样的. 特点:每一个对象都有hashcode,默认的值是每一个对象的地址. 2.hashcode的作用: 博主已知的方便用户使用散列表插入数据,我们知道,集合有两种,list----可重复,set----不可重复. 其中set实现不可重复就需要使用到hashcode和equals方法. 散列表set是使用链表数组实现的,每一个列

java课堂笔记------toString方法和equals方法

* 重写toString方法 * 当我们需要使用当前类的toString方法时,通常我们 * 就需要重写该方法.具体返回字符串的格式没有严格 * 要求,可根据将来实际开发中的需求而定.但通常反 * 回的字符串中应当包含当前类的属性值,以便了解当前 * 对象的信息. * 格式:(x,y) public String toString(){ return "(" + x + "," + y + ")"; } * 通常我们会重写一个类的equals方法

JAVA中Object类中的equals方法补充

Object类中的equals方法: 无论new多少个对象,当使用 "= =" 来判断的时候,是判断内存地址.判断回事false 若是需要进行对象之间的判断,则需要重写equals方法: public boolean equals(Object obj)//obj是传入的形式参数(对象) { if (obj == null)//判断对象是否为空 { return false;//空则返回false } else { if ( obj instanceof cat)//判断这个传入参数(

Effective Java 第三版——10. 重写equals方法时遵守通用约定

Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将近8年的时间,但随着Java 6,7,8,甚至9的发布,Java语言发生了深刻的变化. 在这里第一时间翻译成中文版.供大家学习分享之用. 10. 重写equals方法时遵守通用约定 虽然Object是一个具体的类,但它主要是为继承而设计的.它的所有非 final方法(equals.hashCode.toStr

JAVA中重写equals()方法为什么要重写hashcode()方法?

object对象中的 public boolean equals(Object obj),对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true:注意:当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码.如下:(1)当obj1.equals(obj2)为true时,obj1.hashCode() == obj2.hashCode()必须为true (2)当obj1.ha