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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 马浩 中级黑马   /  2012-5-1 20:42  /  2388 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

class Demo
{
        int num=100;
}

class Demo1
{
        public static void main(String[]args)
        {
                Demo D1=new Demo( );
                Demo D2=new Demo( );
        int a=D1.num;
        int b=D2.num;
        System.out.println(a);//a=100       
                System.out.println(b);//b=100               
                System.out.println(a==b); //结果是false,因为a和b值虽相等,但地址不一样,所以false               
                System.out.println(D1.equals(D2));//结果是false,这里D1和D2比的是什么?也是地址吗?      
           }
}
//对象D1和D2中的num值都是100,equals不是比较内容的吗??怎么比才能是true啊??求高手指点

7 个回复

倒序浏览
你在Demo类中重写equals()方法,即可:
  1. class Demo
  2. {
  3.     int num=100;
  4.    
  5.     public boolean equals(Object obj) {
  6.         if(obj instanceof Demo) {
  7.                 Demo d = (Demo) obj;
  8.                 return this.num==d.num;
  9.         }
  10.         return false;
  11.     }
  12. }

  13. class Demo1
  14. {
  15.         public static void main(String[]args)
  16.         {
  17.                 Demo D1=new Demo( );
  18.                 Demo D2=new Demo( );
  19.                 int a=D1.num;
  20.                 int b=D2.num;
  21.                 System.out.println(a);      
  22.                 System.out.println(b);              
  23.                 System.out.println(a==b);               
  24.                 System.out.println(D1.equals(D2));     
  25.     }
  26. }
复制代码
回复 使用道具 举报
equals方法比较的是内容,这句话不错,但是同学你自习看一下你比较的是内容吗?你比较的还是类的引用的地址呀!不信的话,你可以用输出语句输出语句打印一下D1,你就知道了,还有就只你觉得比较两个对象的引用有意义吗?很明显他们不可能相同,要是你这样写System.out.println(D1.num == D2.num); 这句话很明显会输出 true ,我猜你可能是想  System.out.println((D1.num+"").equals(D2.num+""));  这样输出,当让这句话也会输出 true ,可是你不觉得这样很麻烦吗。还不如上一句简单呢。
回复 使用道具 举报
在这里面equals比的也是对象的地址
equals是超类Object里的方法,默认比较的应该都是引用或者地址。除非是子类进行该方法的了重写。
所以如果需要按照自定义的条件比较,就需要覆盖这个方法。
在equals方法里面按对象的成员值比较就行了。

希望能给你带来帮助。纯属本人理解,回答有错误的地方也请指正。
回复 使用道具 举报
若Demo类不重写equals()方法,D1.equals(D2)效果等价于D1 == D2,而D1、D2是栈内存中Demo类的不同的引用,显然是不相等的!
回复 使用道具 举报
只需要在Demo中加入        public boolean equals(Object obj) {
                if(!(obj instanceof Demo))
                        throw new ClassCastException("类型不匹配");
                       
                        Demo d = (Demo)obj;
                        return (d.num==this.num)?true:false;
        }
你要知道,你想要怎么相等是你自己决定的,只需要按照自己的想法从写equals方法即可。
回复 使用道具 举报
兄弟! 我想还你没没用理解
  1. Demo D1=new Demo( );
  2. Demo D2=new Demo( );
复制代码
这两句话的意义!
这里是指在在栈区建立两个引用D1 ,D2,而在内存中去开辟空间建立两个对象。
那么这里的D1,D2 其实就相当C++语言中的指针。分别是指向内存中的引用也就是地址。
你这样用equals去比就是相当与比内存地址的值!
  1. System.out.println(D1);
  2. System.out.println(D2);
复制代码
这里输出来你就可以看到输出的是
Demo@c17164
Demo@1fb8ee3
这就是表示是Demo类型的@后面的代表内存的值。
虽然是euqals比较的是值,但这里你传入的参数是地址,所有输出肯定是false;
谢谢!
回复 使用道具 举报
刘基军 发表于 2012-5-1 20:58
你在Demo类中重写equals()方法,即可:

嗯,终于明白啦
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马