黑马程序员技术交流社区

标题: 关于equals问题! [打印本页]

作者: 521123270    时间: 2015-5-16 19:57
标题: 关于equals问题!
1.      编译并运行以下代码将发生什么?(  )
class MyClass {
    intx;
    MyClass(inti) {
       x= i;
    }
    publicstatic void main(String args[]) {
       MyClassm1 = new MyClass(100);
       MyClassm2 = new MyClass(100);
       if(m1.equals(m2)) {
           System.out.println("Bothare equal");
       }else {
           System.out.println("Bothare not equal");
       }
    }
}
求解!请详细说明原因!解释!!{:3_64:}
作者: pvbj0314    时间: 2015-5-16 19:57
本帖最后由 pvbj0314 于 2015-5-16 20:48 编辑

MyClass类中没有定义equals方法,因为所有类都是Object类的直接或间接子类,所以下面调用的m1.equals(m2)是继承Object的方法equals。根据Object中equals方法的功能:这个方法只有在两个对象引用指向同一个对象时,才返回true,否则返回false(可以参考API文档中关于Object对象的描述)。这和m1 == m2的结果是一样的,m1==m2比较的是m1和m2的内容,而m1和m2都是MyClass类型的引用,所以比较的是m1指向的对象地址和m2指向的对象地址。因为程序中MyClass  m1 = new MyClass(100);MyClass  m2 = new MyClass(100);都使用了new 操作符,也就是说即使你传入的参数值相同(都100),但创建的对象位于不同的地址处。如果将第二名改为m2 = m1;将得到"Bothare equal"。
作者: 武腊福    时间: 2015-5-17 00:14
Bothare not equal 执行的是比较地址,你得重写equals 方法
作者: 521123270    时间: 2015-5-17 09:42
pvbj0314 发表于 2015-5-16 19:57
MyClass类中没有定义equals方法,因为所有类都是Object类的直接或间接子类,所以下面调用的m1.equals(m2)是 ...

这和m1 == m2的结果是一样的,m1==m2比较的是m1和m2的内容,而m1和m2都是MyClass类型的引用,所以比较的是m1指向的对象地址和m2指向的对象地址。   这句有点不懂!!m1==m2  ==是比较内容还是对象地址值?分别说明下覆盖了Object的 还有没覆盖的!== 到底比较的是什么?{:3_57:}
作者: pvbj0314    时间: 2015-5-17 19:25
m1和m2的内容就是对象的地址,你可以认为引用是一种变量类型,MyClass类的引用存放的就是MyClass类的地址值。
方法equals()比较两个对象是否相等,如果它们相等,则返回true,反之,返回false。Object类中的equals()方法使用(==)符号去判断两个对象是否相等。对于基础数据类型,它能够给出正确的结果。对于对象,就不是了。Object中的equals()方法测试对象的引用是否相等,只能判断两个对象引用是否指向同一个对象。
要测试两个对象是否是等值的(包含同样的信息),你必须覆盖equals()方法。下面是一个Book类的例子:
  1. public class Book {
  2.     ...
  3.     public boolean equals(Object obj) {
  4.         if (obj instanceof Book)
  5.             return ISBN.equals((Book)obj.getISBN());
  6.         else
  7.             return false;
  8.         }
  9. }
复制代码
测试这个Book类的两个对象是否相等代码:
  1. // Swing Tutorial, 2nd edition
  2. Book firstBook  = new Book("0201914670");
  3. Book secondBook = new Book("0201914670");
  4. if (firstBook.equals(secondBook)) {
  5.       System.out.println("objects are equal");
  6. } else {
  7.       System.out.println("objects are not equal");
  8. }
复制代码
虽然firstBook和secondBook指向两个不同的对象,但是这个程序会显示objects are equal。这是因为比较的是它们的ISBN值。
当相等运算符(==)不能用于你的类时,你应该覆盖equals()方法。
注意:如果你覆盖equals()方法,你必须同样覆盖hashCode()方法。以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。
关于equals()和hashCode()你可以参考API手册中Object类的条目。






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2