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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马-小龙 中级黑马   /  2013-3-4 23:16  /  1280 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

public boolean equals(Object obj) {
                if (this == obj) {
                        return true;
                }
        //这个if语句不明白,obj本来就是Object类型的,难道不用
        //向下强转吗之后再判断是否是Teacher类型的吗?
                if (!(obj instanceof Teacher)) {
                        return false;
                }

                Teacher t = (Teacher) obj;
                return this.name.equals(t.name) && this.age == t.age;
        }

5 个回复

倒序浏览
你是第二个if不明白吧  obj不用强转的原因是  当调用该函数的对象传递参数时,会用多态的形式传递一个对象,obj指向的就是该对象,且该对象的类型是确定的,Teacher类或非Teacher  ,所以不用强转。如果强转了,是if的判读语句就没意义了。
回复 使用道具 举报
本帖最后由 克零岚 于 2013-3-5 00:06 编辑

在JAVA中instanceof运算符(跟==,>,<是同一类东东) 的作用是判断对象是否是后面类, 子类,实现类的实例.
  1. if (!(obj instanceof Teacher)) {  //Object类是一切类的父类,所有的类默认继承了Object类任何对象都能被Object接收                           
  2. return false;                                //毫无疑问Teacher类是Object子类,如果你把obj强制向下转型为Teacher之后,那还需要判断吗?
  3. }
复制代码

评分

参与人数 1黑马币 +9 收起 理由
黄玉昆 + 9 赞一个!

查看全部评分

回复 使用道具 举报
Object是所有类的超类,所以可以接受任何类型,所以如果你这里接受了一个其他类型的话,那么就不成立了,所以需要用当前对象(this)和传入的对象(obj)比较一下啦,是否两者为同一类型
回复 使用道具 举报
  1. public class Test {

  2.         public static void main(String[] args) {
  3.                 Person p = new Teacher();
  4.                 Object o = p;
  5.                 Teacher t = new Teacher();
  6.                 System.out.println(t.equals(o));
  7.         }

  8. }

  9. class Person {

  10. }

  11. class Teacher extends Person {

  12.         @Override
  13.         public boolean equals(Object obj) {
  14.                
  15.                 if (!(obj instanceof Teacher)) {
  16.                         System.out.println("false");
  17.                         return false;
  18.                 }else{
  19.                         System.out.println("obj instanceof Teacher");
  20.                 }

  21.                 return true;
  22.         }

  23. }
复制代码
父类引用指向子类对象。
回复 使用道具 举报
  if (this == obj) {
       return true;
    }
//equals方法通常都是通过 X.equals(Y) ,X,Y应该属于同一个类的对象。
if(this == obj)  相当于判断X == Y 实际上在这里比较的不是两个对象的内容(对象各属性的值)。
而是比较两个对象的地址是否相同,如果两个对象的内存地址是一样的,说明这两个对象就是同一个对象(内存中的每个对象的地址都是唯一的)。

  if (!(obj instanceof Teacher)) {
      return false;
    }
//equals方法是用来比较两个对象是否相同,如果两个对象都不是同一个类创建的,自然就不是相同的,所以返回false。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

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