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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马张旭明 中级黑马   /  2012-8-8 00:15  /  1941 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

class Demo
{
  private int num;
   Demo(int num)
   {
       this.num = num;
   }
public boolean equals(Object obj)
   {
   }
public boolean equals(Demo c)
   {
   }
}

我想问在往equals里传一个Demo对象的话会调用哪一个equals函数,Object什么都可以,而Demo也没有错,两个都行,不知道会调用谁

评分

参与人数 1技术分 +1 收起 理由
张_涛 + 1 赞一个!

查看全部评分

6 个回复

倒序浏览
很特殊的重载,会先调用public boolean equals(Demo c),会从具体的来。
回复 使用道具 举报
这里是根据你传入的参数来调用equals方法的,如果你传入的是Demo对象的参数,
就调用equals(Demo c)方法,如果你传入的是除了Demo对象以外的任何参数,都调用 equals(Object obj)
以下是我用代码做的一个测试
class Demo
{
  private int num;
   Demo(int num)
   {
       this.num = num;
   }
public boolean equals(Object obj)
   {
        return true;
   }
public boolean equals(Demo c)
   {
        return false;
   }
}
class DemoTest
{
        public static void main(String[] args)
        {
                Demo d=new Demo(3);
                System.out.println(d.equals("aaa"));//结果为true
                System.out.println(d.equals(2222));//结果为true
                System.out.println(d.equals(new Demo(3)));//结果为false
                System.out.println(d.equals(d));//结果为false
                System.out.println(d.equals(new Demo(4)));//结果为false

        }
}

评分

参与人数 1技术分 +1 收起 理由
张_涛 + 1 很给力!

查看全部评分

回复 使用道具 举报
肯定是调用第二个咯,这本身就是重载的体现啊,不然干嘛要重载呢?楼上的test也可以说明这一点!
回复 使用道具 举报
嗯,知道了,是优先具体的
回复 使用道具 举报
楼主看看

未命名.jpg (52.48 KB, 下载次数: 32)

看看

看看
回复 使用道具 举报
public boolean equals(Object obj)
   {
   }
public boolean equals(Demo c)
   {
   }
因为两个放发的参数列表的类型不同,所以equals方法重载了
当你调用equals方法时,就要看你传入的实参具体是什么类型的了,如果你传入的是Demo类型的对象那就会执行下面的equals方法,
当你调用除了Demo类型以外的任意一个类型对象的时候就会执行上面一个equals方法。因为上面equals方法的参数类型是Object类型,什么类型的都可以接收(因为多态的原因)。

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马