黑马程序员技术交流社区

标题: java小问题之一 [打印本页]

作者: abc张强8    时间: 2014-7-1 10:26
标题: java小问题之一
为什么结果为两行false
求大神解答
  1. public  class  EqualOrNot {
  2. public static void main(String[] args) {
  3. B  b1=new  B(5);
  4.   B  b2=new  B(5);
  5.   System.out.println(b1==b2);
  6.   System.out.println(b1.equals(b2));
  7. }
  8. }
  9. class  B {
  10. int  x;
  11. B( int  y){ x=y; }
  12. }
复制代码

作者: 001可望成功    时间: 2014-7-1 10:55
由于你使用new开辟了两个新内存,所以b1和b2的引用是不一样的,所以b1==b2输出false,在你的自定义类中并没有覆写equals方法,所以他是直接继承Object类中的equals方法,在Object类中,equals方法和==是一样的,都比较的是对象
作者: 那片天空    时间: 2014-7-1 11:18
System.out.println(b1.equals(b2));
你这的equals方法还是Object的方法,比的还是地址值(俩个对象肯定地址值不同)
要比较内容要重写equals方法:
public class  EqualOrNot {
        public static void main(String[] args) {
                B b1 = new B(5);
                B b2 = new B(5);
                System.out.println(b1 == b2);
                System.out.println(b1.equals(b2));
        }
}

class B {
        int x;

        B(int y) {
                x = y;
        }
        // 重写下equals方法
        public boolean equals(Object obj) {
                if (this == obj)
                        return true;
                if (obj == null)
                        return false;
                if (getClass() != obj.getClass())
                        return false;
                B other = (B) obj;
                if (x != other.x)
                        return false;
                return true;
        }
}

作者: 215041631    时间: 2014-7-1 11:23
System.out.println(b1==b2);  返回FALSE 是因为b1和b2是引用变量,他们实际值是b1和b2对象的地址,他们肯定不同,所以是FALSE。第二个你使用EQUALS方法来比较两个值,因为你的类中没有EQUALS方法,他会调用OBJECT的EQUALS方法,Object中的equals比较的是两个对象应用的位模式,即物理地址。这与“==”一样。所以还是FALSE
作者: 24岁???    时间: 2014-7-1 11:42
复写equals方法就好了
作者: I'm_permanent.    时间: 2014-7-1 11:47
你new出来的两个值在堆内存中的指向地址是不同的。
所以==方法判断他们的结果是false
作者: 導ぷ仙″兲蕐    时间: 2014-7-1 12:17
第一行==是比较的对象,第二行 没有重写equals方法默认是(和==作用相同):equals 方法在非空对象引用上实现相等关系:
Object 类的 equals 方法实现对象上差别可能性最大的相等关系;即,对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true(x == y 具有值 true)。


作者: ahuhxl    时间: 2014-7-1 14:06
学习了!
作者: abc张强8    时间: 2014-7-1 23:03
導ぷ仙″兲蕐 发表于 2014-7-1 12:17
第一行==是比较的对象,第二行 没有重写equals方法默认是(和==作用相同):equals 方法在非空对象引用上实现相 ...

多谢帮助
作者: abc张强8    时间: 2014-7-1 23:04
215041631 发表于 2014-7-1 11:23
System.out.println(b1==b2);  返回FALSE 是因为b1和b2是引用变量,他们实际值是b1和b2对象的地址,他们肯 ...

恩啊,刚又看了视频才弄懂
作者: 卞新浩    时间: 2014-7-1 23:11
你是要进38期吗
作者: 沐子松/kf    时间: 2014-7-1 23:21
学习                      
作者: idency    时间: 2014-7-1 23:24
:handshake
作者: 黄晓萌    时间: 2014-7-2 09:27
都是大神啊。

作者: clf900630    时间: 2014-7-2 15:52
蒙圈了,又醒了.
作者: android0276    时间: 2014-7-2 16:21
两个值在堆内存中的指向地址不同,所以判断的时候为false,导致出现问题
作者: abc张强8    时间: 2014-7-2 21:29
卞新浩 发表于 2014-7-1 23:11
你是要进38期吗

是啊,深圳的,这几天天天都睡不好,赚技术分
作者: abc张强8    时间: 2014-7-2 21:30
導ぷ仙″兲蕐 发表于 2014-7-1 12:17
第一行==是比较的对象,第二行 没有重写equals方法默认是(和==作用相同):equals 方法在非空对象引用上实现相 ...

嗯呢,我后面给弄错了,谢谢啊




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