 |
| 关于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)); } }
|
|
|
评论人: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的
|
|
|
|
|
 |