A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黄玉昆 黑马帝   /  2013-2-4 19:41  /  1361 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 黄玉昆 于 2013-2-5 10:28 编辑

假设存在一个Employee的超类,和一个Manager的子类,有如下定义:
Employee e = new Employee();
Manager m = new Manager();
1、在这里,这两个对象都具有相同的姓名,薪水等信息,那么调用e.equals(m),返回的是true还是false呢?
2、另外equals这个方法具有对称性,也就是说,对于任何非空引用x和y,如果x.equals(y)返回true,则y.equals(x)也返回true。
     那么在这个例子中,如果调用m.equals(e)的话,返回的是true还是false呢?
3、还有就是,是不是对于两个对象不属于同一个类,就一定不相等?
4、如果有一个程序,是需要删除两个一模一样的对象,那么要怎么比较才最有效率,最完美的比较方法怎么定义才能更好地实现这个程序?
在此向大家求解,希望有详细解答,谢谢。


评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1 赞一个!

查看全部评分

5 个回复

倒序浏览
既然两个对象相同的参数,那么相等;
equals的重写
1、声明格式
    public  boolean equals(Object obj)

   其比较规则为:当参数obj引用的对象与当前对象为同一个对象时,就返回true,否则返回false.


比如以下两个对象animal1和animal2,引用不同的对象,因此用==或equals()方法比较的结果为false;而animal1和animal3变量引用同一个DOg对象,因此用= =或者equals()方法比较的结果为true.

   Animal  animal1=new Dog();
   Animal  animal2=new  Cat();
   Animal animal3=animal1;

则animal1==animal2   (FALSE)
   animal1.equals(animal2)  (false)

   animal1==animal3   (true)
   animal1.equals(animal3)   (true)


而JDK类中有一些类覆盖了oject类的equals()方法,比较规则为:如果两个对象的类型一致,并且内容一致,则返回true,这些类有:
java.io.file,java.util.Date,java.lang.string,包装类(Integer,Double等)

比如
Integer  int1=new Integer(1);
Integer int2=new Integer(1);


String str1=new String("hello");
String str2=new String("hello");

int1==int2   输出:false,因为不同对象
int1.equals(int2)   输出:TRUE


str1==str2   (false)
str1.equals(str2)   (true)
  当然,可以自定义覆盖object类的equals()方法,重新定义比较规则。比如,下面Person类的equals()比较规则为:只要两个对象都是Person类,并且他们的属性name都相同,则比较结果为true,否则返回false

public class Person{
   private String name;
   public Person(String name)
  {
     this.name=name;
   }
public boolean equals(Object o)
{
  if (this==0) return true;
if (!o instanceof Person) return false;
final Person other=(Person)o;
if (this.name().equals(other.name()))
    return true;
else
  return false;
}

}


注意,在重写equals方法时,要注意满足离散数学上的特性

1、自反性   :对任意引用值X,x.equals(x)的返回值一定为true.
2    对称性:   对于任何引用值x,y,当且仅当y.equals(x)返回值为true时,x.equals(y)的返回值一定为true;
3    传递性:如果x.equals(y)=true, y.equals(z)=true,则x.equals(z)=true
4   一致性:如果参与比较的对象没任何改变,则对象比较的结果也不应该有任何改变
5   非空性:任何非空的引用值X,x.equals(null)的返回值一定为false

评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1 很给力!

查看全部评分

回复 使用道具 举报
如果你的类没有复写equals应该返回false
回复 使用道具 举报
李洪因 发表于 2013-2-4 20:01
既然两个对象相同的参数,那么相等;
equals的重写
1、声明格式

你说的这个“int1.equals(int2)   输出:TRUE;和str1.equals(str2)   (true)”是因为有引用是相同的,所以是true,对吧?可是说半天,我还是不明白,那个对称性所得的结果是什么,是不是e.equals(m)和m.equals(e)返回的值是相同的呢?如果不同,那么这个对称性的原则是不是就不成立了呢?希望可以对我的四个问题分别解答,谢谢
回复 使用道具 举报
回答楼主:
1.在复写了equals方法的前提下是 true
2.true
3.不是,这跟是不是一个类中没关系
4.不会做
回复 使用道具 举报
李洪因 发表于 2013-2-4 21:10
回答楼主:
1.在复写了equals方法的前提下是 true
2.true

依然十分感谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马