黑马程序员技术交流社区

标题: 关于object父类的问题 [打印本页]

作者: 闪亮未来    时间: 2013-11-3 17:20
标题: 关于object父类的问题
  1. class Demo
  2. {
  3.         private int num;
  4.         Demo(int num)
  5.         {
  6.                 this.num=num;
  7.         }
  8.         public boolean equals(Object obj)
  9.         {
  10.                 if (!(obj instanceof Demo))
  11.                         return false;
  12.                 Demo d=(Demo)obj;
  13.                 return num==d.num;
  14.         }
  15. }

  16. class ObjectDemo
  17. {
  18.         public static void main(String[] args)
  19.         {
  20.                 Demo d1=new Demo(5);
  21.                 Demo d2=new Demo(5);
  22.                 System.out.println(d1.equals(d2));
  23.         }
  24. }
复制代码
if (!(obj instanceof Demo))  这一句为什么是这样的,而不是if (!(obj instanceof Object)),  

equals(Object obj) 函数的参数类型是Object类中的啊,肯定不是Demo啊,可是外面传进来的又是Demo类的,父类和子类有点乱了,谁帮忙整理下啊
作者: ixiangfeng    时间: 2013-11-3 17:28
本帖最后由 ixiangfeng 于 2013-11-3 17:49 编辑

       if (!(obj instanceof Demo)) 这里的意思是 当obj不是Demo类的实例对象时为真,执行 return false ,  当obj属于Demo类的实例对象时if为假,执行下面的两行代码 Demo d=(Demo)obj;          return num==d.num;  因为只有当obj是Demo的实例对象才能比较 强转是因为多态 实参传进去时自动提升为Object,父类中不能使用.num 所以必须强转回子类Demo才能使用obj.num再进行比较
作者: ixiangfeng    时间: 2013-11-3 17:32
所有类都是Object的子类 如果像你说的if (!(obj instanceof Object)) 永远都是假的  就是无论传什么进去比较都会返回true 即使你传一个int  long 或者Person等任何东西都会返回true ,你想想把数字2,把人、狗都传进去比较返回都是true
作者: ~﹏~    时间: 2013-11-3 17:36
你要重写的是Demo的equals方法,因为JAVA每个类都是继承Object的,所以Demo自然会继承Object
  1. public boolean equals(Object obj)
  2.         {
  3.                 if (!(obj instanceof Demo))//传入参数是Object类型的,意思就是说可以传入任何对象作为参数,然后传入的参数和Demo相比,看看是否是Demo的实例,如果是                        //Demo的实例,那么,传入的类自然就是Demo类咯
  4.                         return false;
  5.                 Demo d=(Demo)obj;
  6.                 return num==d.num;
  7.         }
复制代码

作者: 回天之力    时间: 2013-11-3 18:52
1,Object是所有类的祖先,所以说你要改成这个if (!(obj instanceof Object)),  没有意义。obj instanceof Object结果都为true,那就失去了if语句的作用。所以不能改。
2,equals(Object obj) 函数的参数类型是Object类中的啊,肯定不是Demo啊---------------Demo继承Object,所以它也可以调用继承下来的equals()方法。只是里面的参数是Object,这时它用的是多态应用。以后学到了即了解了,不必纠结。
作者: 闪亮未来    时间: 2013-11-3 19:12
回天之力 发表于 2013-11-3 18:52
1,Object是所有类的祖先,所以说你要改成这个if (!(obj instanceof Object)),  没有意义。obj instanceof  ...

我要的就是你这个答案,不然我一直都很朦胧,多谢,虽然版主没给你技术分,但是我觉得你这个答案很好,解答了我的疑惑




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