黑马程序员技术交流社区

标题: 强制类型转换的一个问题? [打印本页]

作者: jagon    时间: 2014-3-14 11:10
标题: 强制类型转换的一个问题?
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)) ;
         }
}

作者: 张贺    时间: 2014-3-14 11:22
因为Object是所有引用类型的父类,将子类对象赋给父类对象,可以隐式转换,但反过来就需要强制转换。
作者: 谭荣强    时间: 2014-3-14 11:37
name是person的特有属性,Object中没有,obJ是Object引用类型,所以它无法调用。也就是多态中的父类引用无法调用子类的特有属性或方法
作者: 谜燕    时间: 2014-3-15 13:16
因为equals方法的参数列表的类型是Object类型,当你把参数传进去的时候,进行了隐式的向上转型,成为了Object类型,Object类型的很多,不确定。举一个例子,你可以把猫叫小动物,但不能把小动物叫成猫,因为小动物有好多种。所以要强制进行向下转型。
作者: osully    时间: 2014-3-15 14:08
如果不强转,obj所在object类中没有成员变量name和age啊
即obj.name 和 obj.age 是会编译失败的
                   Person per = (Person) obj ;      
                   if (this.name.equals(per.name) && this.age == per.age) {
                            return true ;
                   }
作者: 李猛    时间: 2014-3-15 15:10
因为你使用到了person自身的属性,而你是使用Object接收的(向上转型),如果你要使用person的属性,必须要强转(向下强转),不然无法访问person属性,而你下面又用到了,所以系统默认是错的
作者: duanyoujiji    时间: 2014-3-15 16:01
就是因为要复写Object的equals方法,要复写的话,里面的参数类型无法改变只能是Object 的。Object类中没有name,age的属性,所以就得向下转型了。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2