黑马程序员技术交流社区
标题: 强制类型转换的一个问题? [打印本页]
作者: 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 |