黑马程序员技术交流社区
标题: 关于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
这和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类的例子:
- public class Book {
- ...
- public boolean equals(Object obj) {
- if (obj instanceof Book)
- return ISBN.equals((Book)obj.getISBN());
- else
- return false;
- }
- }
复制代码 测试这个Book类的两个对象是否相等代码:
- // Swing Tutorial, 2nd edition
- Book firstBook = new Book("0201914670");
- Book secondBook = new Book("0201914670");
- if (firstBook.equals(secondBook)) {
- System.out.println("objects are equal");
- } else {
- System.out.println("objects are not equal");
- }
复制代码 虽然firstBook和secondBook指向两个不同的对象,但是这个程序会显示objects are equal。这是因为比较的是它们的ISBN值。
当相等运算符(==)不能用于你的类时,你应该覆盖equals()方法。
注意:如果你覆盖equals()方法,你必须同样覆盖hashCode()方法。以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。
关于equals()和hashCode()你可以参考API手册中Object类的条目。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |