在java中,覆盖Object类的equals()方法的同时为什必须覆盖hashCode()方法?还有,clone()方法在Object中是protected型的,也就是说可以被子类继承且可见的,
那为什么我们在给自己写的类实现克隆的时候必须要覆盖该方法呢?
为什么不可以直接调用基类方法呢?

解决方案 »

  1.   

    OBJECT 得 clone() 方法 只是浅层次得复制,如果你自己写得类有需要深层次得复制得话,当然要覆盖了
    JAVA 没有强制你复写equals()方法时候必须得 复写hashCode(), 还是相对于你自己得EQUELS方法怎么写==对比得是HASHCODE equals是对比得对象得值
      

  2.   

    倘若两个对象equals的话,那么他们的hashCode必然也相等,重写的目的也在于此。
      

  3.   

    Java规范中指出了a.equals(b)必定可以得出a.hashCode() == b.hashCode();反之不一定成立这样做是因为HashMap等这些类会使用到hashCode的,如果不重写则会造成问题
      

  4.   

    我上面说得有些错误,EQUEL 是对比得对象得HASHCODE ==只是简单得值对比.,你复写HASHCODE可以不复写HASHCODE ,但是如果你对EQUEL有特殊得要求 那么最好是要复写得
      

  5.   

    public boolean equals(Object obj) {
    return (this == obj);
        }
    这个是OBJECT里面提供得EQUALS方法
    你可能会奇怪如果这里用得是==那么不是和==一样了吗,都是比对得值那两个NEW STRING("TEST")不是不一样了吗? 这个是因为STRING对EQUALS和HASHCODE都做了覆写
    public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    if (anObject instanceof String) {
        String anotherString = (String)anObject;
        int n = count;
        if (n == anotherString.count) {
    char v1[] = value;
    char v2[] = anotherString.value;
    int i = offset;
    int j = anotherString.offset;
    while (n-- != 0) {
        if (v1[i++] != v2[j++])
    return false;
    }
    return true;
        }
    }
    return false;
        }
        public int hashCode() {
    int h = hash;
    if (h == 0) {
        int off = offset;
        char val[] = value;
        int len = count;            for (int i = 0; i < len; i++) {
                    h = 31*h + val[off++];
                }
                hash = h;
            }
            return h;
        }
      

  6.   

    楼上kingdoom的楼上(哎,也是kingdoom),是不是说错了。
    你说“我上面说得有些错误,EQUEL 是对比得对象得HASHCODE ==只是简单得值对比.,你复写HASHCODE可以不复写HASHCODE ,但是如果你对EQUEL有特殊得要求 那么最好是要复写得”从Object这个类的代码里面可以看出来,equals和==都是对比两个对象是否是完全同一个对象。
    而String类复写了equals方法之后,做到了用==来判断两个对象是否是完全同一个对象,用equals来判断两个对象的值是不是相等。
    应该是这样吧。
      

  7.   

    == 是判断 栈 上面得,如果判断得是对象其实就是对比判断得引用 
    STRING 得equels 其实就是对比得HASHCODE
      

  8.   

    各位说得都很有道理啊
    那小第就不明白了?为什么既然clone()方法是基类中的protected方法,在子类继承的以后是可见的。我在做设计的时候却不可以调用,编译器会报错,这是为什么?(在没有覆盖的情况下会报错)
      

  9.   

    首先,如果不覆盖clone()方法,就是浅复制,倘若A类中还包含B类的对象变量的话,那么两个A类对象中的B类对象变量将会指向同一个B类对象。
    其次,只有A类对象才能克隆A类对象。