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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© ぺsimon☆ 中级黑马   /  2013-4-25 01:21  /  1327 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 ぺsimon☆ 于 2013-4-25 19:43 编辑
  1. class Person
  2. {
  3.         private String name;
  4.         private int age;
  5.         Person(String name,int age)
  6.         {
  7.         this.name=name; //把name赋值给对象的name
  8.         this.age=age;  //把age赋值给对象的age
  9.         }
  10.         
  11.         public boolean equals(Object obj)
  12.         {
  13.         if(!(obj instanceof Person))//判断obj是否为Person的子类
  14.         return false;
  15.         
  16.         Person p=(Person)obj;//把obj强转为Person类型

  17.         
  18.         return this.name.equals(p.name)&&this.age==p.age;
  19.         }
复制代码
问题:public boolean equals(Object obj)
{
if(!(obj instanceof Person))//判断obj是否为Person的子类
return false;
Person p=(Person)obj;//把obj强转为Person类型
看不懂上面几句代码是怎样运行的?
我的理解是这样的:判断obj是否为Person的子类,如果不是子类就,返回false,
但是程序里没有写当判断语句为假的时候把obj强转为person类,但是为什么程序会自动执行下面的代码呢?
我把代码改成:
public boolean equals(Object obj)
        {
        if(obj instanceof Person)//判断obj是否为Person的子类
        Person p=(Person)obj;//把obj强转为Person类型
       }
程序又报错,为什么呢?

评分

参与人数 1技术分 +1 收起 理由
张熙韬 + 1

查看全部评分

8 个回复

倒序浏览
本帖最后由 钟伟杰 于 2013-4-25 01:46 编辑

首先要明白instanceof的用法,它是用来判断对象是否是特定类的一个实例。
obj instanceof Person 不是判断obj是否是Person的子类,而是判断obj是否是Person的对象,Object obj = new Person();

if(!(obj instanceof Person))
     return false;
这个判断语句是一体的,可以写成如下:
if(!obj instanceof Person))
{
      retrun false;
}
按照对instanceof的解释,这个if判断语句可以理解为,如果传入的对象obj不是Person的实例,返回false;
如果是的话就跳到Person p = (Person)obj;强转obj

你代码改成你说的那样就缺少了返回值,当然错,
但是你是不是漏了下面一句:
public boolean equals(Object obj)
{
        if(obj instanceof Person)
        Person p=(Person)obj;
        return this.name.equals(p.name)&&this.age==p.age;
}
这种方法也是错的,因为你只强转了是Person的obj,obj接收的是
其他类型,那么就不会执行强转,p就没有定义了



评分

参与人数 1技术分 +1 收起 理由
张熙韬 + 1

查看全部评分

回复 使用道具 举报
钟伟杰 发表于 2013-4-25 01:31
首先要明白instanceof的用法,它是用来判断对象是否是特定类的一个实例。
obj instanceof Person 不是判断o ...

您好,我不明白的是当没有执行,return false;语句的时候
程序为什么会自动执行:Person p=(Person)obj;//把obj强转为Person类型
回复 使用道具 举报
本帖最后由 钟伟杰 于 2013-4-25 01:55 编辑
ぺsimon☆ 发表于 2013-4-25 01:42
您好,我不明白的是当没有执行,return false;语句的时候
程序为什么会自动执行erson p=(Person)obj;//把 ...


不应该把return false;单独看成一条语句;
它是if语句的执行体语句,当满足判断才执行
return false;不满足就跳到下面的语句继续执行呗
回复 使用道具 举报
版主拎包郑重提示:如果楼主问题已经解决那么。在自己发表的帖子下面,点“修改”,
然后把主题的分类标记成“已解决”。就OK了{:soso_e102:}

回复 使用道具 举报
袁梦希 发表于 2013-4-25 09:00
版主拎包郑重提示:如果楼主问题已经解决那么。在自己发表的帖子下面,点“修改”,
然后把主题的分类标记 ...

呵呵,明白
回复 使用道具 举报
钟伟杰 发表于 2013-4-25 01:52
不应该把return false;单独看成一条语句;
它是if语句的执行体语句,当满足判断才执行
return false;不 ...

return false;下面是不是省略了一条代码   判断if()为false执行
Person p=(Person)obj;//把obj强转为Person类型
回复 使用道具 举报
吴波 中级黑马 2013-4-25 17:35:41
8#
ぺsimon☆ 发表于 2013-4-25 14:21
return false;下面是不是省略了一条代码   判断if()为false执行
Person p=(Person)obj;//把obj强转为Pe ...

是省略了,省略的是if(obj instanceof Person)
回复 使用道具 举报
谢谢大家
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马