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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马任雪刚 中级黑马   /  2012-7-1 18:05  /  2912 人查看  /  15 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

class Demo
{
        private int age;
        Demo(int age)
        {
                this.age=age;
        }
        public boolean equals(Object obj)//Object obj=d1;
        {
                if(!(obj instanceof Demo))//是判断的obj的所属的类型吗,那obj不是所属于object类型吗??????
                        return false;
                Demo d=(Demo)obj;
                return this.age==d.age;
        }
}
public class Fugai
{

       
        public static void main(String[] args)
        {
                Demo d1=new Demo(3);
                Demo d2=new Demo(3);
                Demo d3=new Demo(3);
                System.out.println(d1.equals(d2));
        }

}

15 个回复

倒序浏览
      public boolean equals(Object obj)//Object obj=d1;
        {
                if(!(obj instanceof Demo))//是判断的obj的所属的类型吗,那obj不是所属于object类型吗??????
                        return false;
                Demo d=(Demo)obj;
                return this.age==d.age;
        }
这上面的代码一点问题都没有啊,Object是所有类的父类,为了能共用这个方法,方法参数是写的最通常的类型Object,
这也是没有泛型之前的一种重用方法。而后面判断是否Demo类型!(obj instanceof Demo)也是非常合理的,因为Demo类
是Object类的子类,是Demo的类型,也就是Object类型

点评

你这么描述会让人看晕的  发表于 2012-7-2 10:47
回复 使用道具 举报
public boolean equals(Object obj)//Object obj=d1;
        {
                if(!(obj instanceof Demo))//是判断的obj的所属的类型吗,那obj不是所属于object类型吗??????
                        return false;
                Demo d=(Demo)obj;
                return this.age==d.age;
        }

其实楼主这个方法是用来服务于他的     
Demo d1=new Demo(3);
Demo d2=new Demo(3);
Demo d3=new Demo(3);
System.out.println(d1.equals(d2));

传入的d2加入说不是demo类型的就会返回一个false,或者他们的age值不一样也会发挥false。

if(!(obj instanceof Demo))//这段代码是判断传入的对象到底是不是demo类型的,如果不是肯定是没办法比较的
                        return false;
                Demo d=(Demo)obj;如果是就强转过来,因为传入的是一个object类型,不是demo
                return this.age==d.age;然后在对比自己的age和传入的age的值是否相等。在本程序中也就是d1和d2的age的值

评分

参与人数 1技术分 +1 收起 理由
刘蕴学 + 1

查看全部评分

回复 使用道具 举报
周刚 发表于 2012-7-1 18:19
public boolean equals(Object obj)//Object obj=d1;
        {
                if(!(obj instanceo ...

怎么合理啦?不能因为是object就合理吧?
回复 使用道具 举报
本帖最后由 feigecal 于 2012-7-1 19:06 编辑

因为是对equals方法的覆盖,所以是要用来和所以类型的对象做比较,所以所以有类型对象属于Object类,这里主要是用于所建的Demo类中的对象的比较,所以if(!(obj instanceof Demo)是判断参与比较的对象是否属于Demo类,不属于的话返回false。如果参与比较的对象(obj)属于Demo类的话,就把它赋给Demo类的对象d,然后判断d的age变量和调用者的age变量是否相等。当然比较的对象也可以是别的类的对象,但会返回false就是了
  1. class Demo
  2. {
  3. private int age;
  4. Demo(int age)
  5. {
  6. this.age=age;
  7. }
  8. public boolean equals(Object obj)
  9. {
  10. if(!(obj instanceof Demo))
  11. return false;
  12. Demo d=(Demo)obj;
  13. return this.age==d.age;
  14. }
  15. }
  16. public class FuGai
  17. {


  18. public static void main(String[] args)
  19. {
  20. String s="bendaren";//因为是String类的对象,所以在if(!(obj instanceof Demo))时返回false
  21. Demo d1=new Demo(3);
  22. Demo d2=new Demo(3);
  23. //Demo d3=new Demo(3);
  24. System.out.println(d1.equals(s));
  25. }

  26. }
复制代码
回复 使用道具 举报
各位友友不要答非所问好吗?人家问的是
是判断的obj的所属的类型吗,那obj不是所属于object类型吗??????
重点是楼主想问的是obj属于Object类型,按代码上来看不属于Demo类型啊!
你看你们都回答的啥啊

点评

判断是不是demo的实例,看的是对象本身的类型,而不是引用类型,这有本质差别,以这个obj来说他的引用类型是Object,实例类型是Demo  发表于 2012-7-2 10:52
回复 使用道具 举报
楼主可能对一些基本概念有些模糊
1.首先明确Object类型是所有类型的父类。
2.instanceof : 用于判断对象的类型。
  用于判断某一类型引用指向的对象到底符不符合什么类型的时候用它。
此处是多态的内容,可以再看下
  1.   public boolean equals(Object obj)//Object obj=d1;就相当于Object obj =new Demo(3);
  2.         {
  3.                 if(!(obj instanceof Demo))//是判断所传入的对象是否属于Demo类型的,这里传入的对象d2是由Demo实例化出来的所以是Demo类型的,当然也是Object
  4.                         return false;       
  5.                 Demo d=(Demo)obj;
  6.                 return this.age==d.age;
  7.         }
复制代码
回复 使用道具 举报
邵阳 发表于 2012-7-1 19:48
各位友友不要答非所问好吗?人家问的是
是判断的obj的所属的类型吗,那obj不是所属于object类型吗???? ...

这位同学 所有的类的对象都可以兼容object类,现在代码是传进来一个object,你知道具体他的类型么不是需要判断一下么?这是一个多态的例子,如果传进来一个String他同样是object的子类,demo也是object的子类,但是他们两个是不同的。
回复 使用道具 举报
Forever。 发表于 2012-7-1 19:53
这位同学 所有的类的对象都可以兼容object类,现在代码是传进来一个object,你知道具体他的类型么不是需 ...

你这样解答人家不就理解了嘛!上面的都是答非所问,你现在回答的非常切中问题。
回复 使用道具 举报
同学,上面你加上注释的那一段,是用的多态,意思是,Object是所有类的父类,所以无论传入什么类型的对象它都可以接收,而之后的instanceof是为了判断传入的对象是不是所属于Demo类型的,因为不是一种类型的,去比较没有什么意义,我觉得你应该把多态那里好好看一看
回复 使用道具 举报
class Demo
{
        private int age;
        Demo(int age)
        {
                this.age=age;
        }
        public boolean equals(Object obj)    //Object obj=d1;    这里obj是父类引用指向子类对象,就是将d1(Demo对象)的值引用传给了obj,然后,obj就指向了堆内存中的d1对象。
   {
                if(!(obj instanceof Demo))    //由于ojb也指向内存中的d1对象,所以可以判定(!(obj instanceof Demo))  = false;即不会执行此判断语句的方法体
                    return false;
                Demo d=(Demo)obj;
                return this.age==d.age;
        }
}
public class Fugai
{

        
        public static void main(String[] args)
        {
                Demo d1=new Demo(3);
                Demo d2=new Demo(3);
                Demo d3=new Demo(3);
                System.out.println(d1.equals(d2));
        }

}
回复 使用道具 举报
邵阳 发表于 2012-7-1 19:48
各位友友不要答非所问好吗?人家问的是
是判断的obj的所属的类型吗,那obj不是所属于object类型吗???? ...

恩恩我就是这个意思
回复 使用道具 举报
在这里是有多态存在的,Object是java所有类的父类,即obj是 Demo类型的上转型对象。
其实当你写  obj instanceof Demo时实际上是相当于
这样写.
if(obj.getClass() == Demo.class)   //obj.getClass(),因为每个类在你定义时都是隐式的重写了getClass方法的所有obj.getClass()返回的是Demo.class  即有多态存在
                {
                        System.out.println(obj.getClass());
                }


这个问题我以前也没有深究过,都是楼主遇到了我自己分析的,我还在找  instanceof的具体实现,这只是我的一种分析。
回复 使用道具 举报
黑马任雪刚 发表于 2012-7-1 21:55
恩恩我就是这个意思

应该是我说的这个吧?:)
回复 使用道具 举报
谭立文 发表于 2012-7-2 00:07
应该是我说的这个吧?

还是不太懂啊。。。
回复 使用道具 举报
黑马任雪刚 发表于 2012-7-2 00:32
还是不太懂啊。。。

当我们在用java编译器编译之后会生成一个.class文件,这些所有的class文件也是一种类型,java用Class这个类来描述,Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的。比较一个对象是否是另一个类型,我们只需要看这个对象所对应的字节码是否是另一个类的字节码。
A a = new A();
Class c1 = A.class;
Class c2 = a.getClass()l;
Class c3 = Class.forName("com.itheima.practice.A");
c1 == c2 && c1 == && c3 //是对应的同一份字节码  
//这是反射的基本概念 把张忠祥老师的视频好好看看 里面都讲的相当经典。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马