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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© abc张强8 中级黑马   /  2014-7-1 10:26  /  1387 人查看  /  17 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

为什么结果为两行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. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1

查看全部评分

17 个回复

倒序浏览
由于你使用new开辟了两个新内存,所以b1和b2的引用是不一样的,所以b1==b2输出false,在你的自定义类中并没有覆写equals方法,所以他是直接继承Object类中的equals方法,在Object类中,equals方法和==是一样的,都比较的是对象

评分

参与人数 1技术分 +1 收起 理由
菜小徐 + 1

查看全部评分

回复 使用道具 举报
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;
        }
}
回复 使用道具 举报
System.out.println(b1==b2);  返回FALSE 是因为b1和b2是引用变量,他们实际值是b1和b2对象的地址,他们肯定不同,所以是FALSE。第二个你使用EQUALS方法来比较两个值,因为你的类中没有EQUALS方法,他会调用OBJECT的EQUALS方法,Object中的equals比较的是两个对象应用的位模式,即物理地址。这与“==”一样。所以还是FALSE
回复 使用道具 举报
复写equals方法就好了
回复 使用道具 举报
你new出来的两个值在堆内存中的指向地址是不同的。
所以==方法判断他们的结果是false
回复 使用道具 举报
第一行==是比较的对象,第二行 没有重写equals方法默认是(和==作用相同):equals 方法在非空对象引用上实现相等关系:
  • 自反性:对于任何非空引用值 x,x.equals(x) 都应返回 true。
  • 对称性:对于任何非空引用值 x 和 y,当且仅当 y.equals(x) 返回 true 时,x.equals(y) 才应返回 true。
  • 传递性:对于任何非空引用值 x、y 和 z,如果 x.equals(y) 返回 true,并且 y.equals(z) 返回 true,那么 x.equals(z) 应返回 true。
  • 一致性:对于任何非空引用值 x 和 y,多次调用 x.equals(y) 始终返回 true 或始终返回 false,前提是对象上 equals 比较中所用的信息没有被修改。
  • 对于任何非空引用值 x,x.equals(null) 都应返回 false。
Object 类的 equals 方法实现对象上差别可能性最大的相等关系;即,对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true(x == y 具有值 true)。

回复 使用道具 举报
学习了!
回复 使用道具 举报
導ぷ仙″兲蕐 发表于 2014-7-1 12:17
第一行==是比较的对象,第二行 没有重写equals方法默认是(和==作用相同):equals 方法在非空对象引用上实现相 ...

多谢帮助
回复 使用道具 举报
215041631 发表于 2014-7-1 11:23
System.out.println(b1==b2);  返回FALSE 是因为b1和b2是引用变量,他们实际值是b1和b2对象的地址,他们肯 ...

恩啊,刚又看了视频才弄懂
回复 使用道具 举报
你是要进38期吗
回复 使用道具 举报
学习                      
回复 使用道具 举报
:handshake
回复 使用道具 举报
都是大神啊。
回复 使用道具 举报
蒙圈了,又醒了.
回复 使用道具 举报
两个值在堆内存中的指向地址不同,所以判断的时候为false,导致出现问题
回复 使用道具 举报

是啊,深圳的,这几天天天都睡不好,赚技术分
回复 使用道具 举报
導ぷ仙″兲蕐 发表于 2014-7-1 12:17
第一行==是比较的对象,第二行 没有重写equals方法默认是(和==作用相同):equals 方法在非空对象引用上实现相 ...

嗯呢,我后面给弄错了,谢谢啊
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马