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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© jagon 中级黑马   /  2014-3-14 11:10  /  1253 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

class Person {
         private String name ;
         private int age ;
         public Person(String name,int age) {
                   this.name = name ;
                   this.age = age ;
         }
         public String toString() {       // 方法覆写
                   return "姓名:" + this.name + ",年龄:" + this.age ;
         }
         public boolean equals(Object obj) {
                   if (this == obj) {     //this指代当前调用equals()方法的对象
                            return true ;
                   }
                   if (obj == null) {
                            return false ;
                   }
                   if (! (obj instanceof Person)) {        // 不是本类对象
                            return false ;
                   }
                   Person per = (Person) obj ;        // 为什么一定要强制类型转换,不转就错,想不通?
                   if (this.name.equals(per.name) && this.age == per.age) {
                            return true ;
                   }
                   return false ;
         }
}
public class TestDemo {
         public static void main(String args[]) {
                   Person per1 = new Person("小王",20) ;
                   Person per2 = new Person("小王",20) ;
                   System.out.println(per1.equals("Hello")) ;
                   System.out.println(per1.equals(per2)) ;
         }
}

评分

参与人数 1技术分 +1 收起 理由
菜小徐 + 1

查看全部评分

7 个回复

倒序浏览
因为Object是所有引用类型的父类,将子类对象赋给父类对象,可以隐式转换,但反过来就需要强制转换。
回复 使用道具 举报
name是person的特有属性,Object中没有,obJ是Object引用类型,所以它无法调用。也就是多态中的父类引用无法调用子类的特有属性或方法
回复 使用道具 举报
因为equals方法的参数列表的类型是Object类型,当你把参数传进去的时候,进行了隐式的向上转型,成为了Object类型,Object类型的很多,不确定。举一个例子,你可以把猫叫小动物,但不能把小动物叫成猫,因为小动物有好多种。所以要强制进行向下转型。

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
如果不强转,obj所在object类中没有成员变量name和age啊
即obj.name 和 obj.age 是会编译失败的
                   Person per = (Person) obj ;      
                   if (this.name.equals(per.name) && this.age == per.age) {
                            return true ;
                   }

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
因为你使用到了person自身的属性,而你是使用Object接收的(向上转型),如果你要使用person的属性,必须要强转(向下强转),不然无法访问person属性,而你下面又用到了,所以系统默认是错的

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
就是因为要复写Object的equals方法,要复写的话,里面的参数类型无法改变只能是Object 的。Object类中没有name,age的属性,所以就得向下转型了。

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
多态的弊端:虽然提高了扩展性,但是只能使用父类的引用访问父类中的成员。如果要通过父类的引用使用子类特有方法,就必须强制将父类的引用转成子类类型,向下转型。
我们能转换的是父类应用指向了自己的子类对象时,该应用可以被提升,也可以被强制转换。多态自始至终都是子类对象在做着变化。

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

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