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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 521123270 中级黑马   /  2015-5-16 19:57  /  2818 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

3黑马币
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:}

最佳答案

查看完整内容

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指向的对象地址 ...

4 个回复

正序浏览
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类的条目。

回复 使用道具 举报
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:}
回复 使用道具 举报
Bothare not equal 执行的是比较地址,你得重写equals 方法
回复 使用道具 举报
本帖最后由 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"。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马