JR 精品文章 - 关于equals重写,这2种有什么区别
AD: jr (at) javaresearch.org


首页 | 动态 | 文章 | FAQ  | 新闻 | 下载 | 代码 | 工作 | 调查 | 术语 | 站点 | 图书 | 论坛 | 帮助 | 全部  

TOP | 交流 | 软件 | 专栏 | 开源 | 译/著 | 源码 | API  | 推荐 | FTP  | 积分 | 统计 | 搜索 | Blog | 我们  
首页 » 研究文集 » Java入门 评论此文章 发表评论     开始监控此文章 开始监控   加入收藏夹  加入收藏夹
关于equals重写,这2种有什么区别
b02213131 原创   更新:2008-06-25 17:39:27  版本: 1.0   

class Cat {
    int color;
    int height,weight;
    public Cat ( int c ,int h ,int w) {                        color = c;
        height = h;
        weight = w;
    }
    boolean equals( Cat c ) {
        return this.color == c.color & this.height == c.height & this.weight == c.weight ;
    }






class Cat {
    int color;
    int height, weight;
    
    public Cat(int color, int height, int weight) {
        this.color = color;
        this.height = height;
        this.weight = weight;
    }
    
    public boolean equals(Object obj) {
        if(obj == null) return false;
        else {
            if(obj instanceof Cat) {
                Cat c = (Cat)obj;
                if(c.color == this.color && c.height == this.height && c.weight == this.weight) {
                    return true;
                }
            }
        }
        
        return false;
    }
    
}


写那个用下面的调用都成功,我的问题是
1.上面第二个里面的public Cat应该不是构造方法了,因为不能加权限标识符,那么在main方法中调用的时候是怎么个流程。
2.上面第一个里面的equals方法不是重写,因为改变了参数类型,所以是重载,而且比父类的访问权限要严格了(也不符合重写的要求),但是用下面的程序可以调用,会不会有什么隐藏的弊端呢?
public class TestEquals {
    public static void main(String[] args){                    Cat c1 = new Cat ( 2, 2, 1);
        Cat c2 = new Cat ( 2, 2, 1);
        Cat c3 = new Cat ( 1, 1, 1);
        
        Cat c4 = c1;
        
        System.out.println(c1==c2);
        System.out.println(c1.equals(c2));
        System.out.println(c1.equals(c3));
    }
}

版权声明   给作者写信
本篇文章对您是否有帮助?  投票:         投票结果:     12       1
作者其它文章: 作者全部文章
评论人:13780917027 发表时间: Sun Jul 06 10:32:20 CST 2008
1.第二个public Cat应该不是构造方法了?不是构造方法是什么?
  语法还没高明白吧?
评论人:dvdface 发表时间: Tue Jul 08 15:23:27 CST 2008
对于第一个问题, 

加了访问关键字还是构造方法啊

不能加返回标示符

public cat(args...) 这个是构造方法.

通常会用 protected cat(args... )来实现Singleton模式,也就是不准你在这个类上面调用new, 而是提供另外一个方法, 比如Cat create()返回一个Cat对象, 而且是唯一的Cat对象.

public void cat (args...) 这个不是构造方法.

第二个问题,没仔细看

问题是equals,第二个方法明显是对的.

equals是在Object里面就定义了的吧, 

正常的写法,就是第二种

试想一下, 你有一个存储对象的集合类, 集合的性质是不能用重复的对象, 所以你写的equals肯定是给这个集合类在put对象进去的时候,进行判断的.

如果你的方法签名是
boolean equals(Cat cat)

这个集合类放的有Cat ,也有Dog, 都是Animal的子类.

显然cat对象和dog对象比较的时候 , dog显然不是Cat类型, 所以最好的办法是按照,第二种写法.

先判断引用是否指向一个对象, 即是否是null
其次,再判断是否存在is-A的关系

最后才是实际的一个字段和一个字段的比较.
评论人:昙花 发表时间: Wed Jul 16 11:48:17 CST 2008
评论没看懂。。。。
评论人:b02213131 发表时间: Thu Jul 17 16:44:53 CST 2008
恩,第一个是搞糊涂了,学的是不能加返回值,记成不能加权限标识符了。。汗

第二个的区别知道了,前一种写法不是重写,只是一个新的方法定义,这样写是不行的,如果碰到HashSet的remove()自动调用的equals,如果是第一种写法,就remove不掉了
评论人:aa278489710 发表时间: Sat Nov 01 13:31:42 CST 2008
应该都是构造方法,只是第二个形式参数隐藏了实参,所以才用this的

这个文章共有 5 条评论
主题: 分享Java入门与提高教程PPT版 上一篇文章
返回文章列表 返回〔Java入门〕
下一篇文章 主题: java的命名规范


文字广告链接
        自主、快速定制基于JAVA的B/S业务系统          重量级企业在线自定义WEB报表平台
        Excel制表、零代码发布、打印、图表结合——快逸报表,免费、稳定、功能强大的java工具
        技术圈: 关于Java、dotNet、PHP、Ruby、奇客、Web2.0等更多资讯博客精选文章

关于 JR  |  版权声明  |  联系我们 

©2002-2006 JR 版权所有 沪ICP备05019622号