黑马程序员技术交流社区

标题: Person p = (Person)obj; 赋值是什么类型用意在何处 [打印本页]

作者: askyle    时间: 2013-5-23 10:55
标题: Person p = (Person)obj; 赋值是什么类型用意在何处
本帖最后由 askyle 于 2013-5-27 10:13 编辑

class Person
{
        private String name;
        private int age;
        Person(String name,int age)
        {
                this.name = name;
                this.age = age;
        }

        public boolean equals(Object obj)
        {

                if(!(obj instanceof Person))
                        return false;

                Person p = (Person)obj; // 这里 (Person)obj; 代表什么意思 我一时理解不了?求解
                //System.out.println(this.name+"....."+p.name);

                return this.name.equals(p.name) && this.age == p.age;
        }
        /**/
        public String getName()
        {
                return name;
        }
        public int getAge()
        {
                return age;
        }
}
                Person p = (Person)obj; // 这里 (Person)obj; 代表什么意思用意在何处 我一时理解不了?求解

作者: 风云    时间: 2013-5-23 11:03
是一个强转的动作,意思就是将obj类型强制转换成Person类型
作者: 张世威    时间: 2013-5-23 11:11
if(!(obj instanceof Person))
                        return false;  //①通过这句,排除非Person实例,剩下的都是Person类或者其子类对象了。

Person p = (Person)obj; // 这里 (Person)obj; 代表什么意思 我一时理解不了?求解
//②obj有可能是Person子类对象,将其强制转换成Person类对象。这样就可以把obj变成一个完完全全的 Person对象了。只有相同类型的对象,才可以比较其属性值,看其是否有相同的属性值。不同类型的对象,比较其属性值好像没有意义吧,比如车子的长度和人的高度比较、动物的重量和猫的重量。

//System.out.println(this.name+"....."+p.name);

return this.name.equals(p.name) && this.age == p.age;

作者: 刘治广    时间: 2013-5-23 11:13
强制转换类型
作者: 谢孔营    时间: 2013-5-23 11:20
class Person
{
        private String name;
        private int age;
        Person(String name,int age)
        {
                this.name = name;
                this.age = age;
        }

        public boolean equals(Object obj)//这里可能用到了多态的向上转型,不需要强制转换
        {

                if(!(obj instanceof Person))
                        return false;

                Person p = (Person)obj; // 这里 (Person)obj; 代表什么意思 我一时理解不了?求解:答:这里用到了向下转型,即转为子类型,需要强制转换,这样子类的特有功能才能使用
                //System.out.println(this.name+"....."+p.name);

                return this.name.equals(p.name) && this.age == p.age;
        }
        /**/
        public String getName()
        {
                return name;
        }
        public int getAge()
        {
                return age;
        }
}

作者: kimi    时间: 2013-5-23 12:19
一开始是对象,把对象转为person 类型
作者: 火之意志    时间: 2013-5-23 13:09
通俗一点说就是:子类到父类是自动类型转换,也就是向上类型转换,父类到子类需要强制类型转换,前提这种强制类型转换是涉及多态,这个父类的引用对象的本质必须是子类的对象(或实例)才能转换成功。这里只拿类说事,接口也类似。
作者: 王靖远    时间: 2013-5-23 14:13
class Person
{
        private String name;
        private int age;
        Person(String name,int age)
        {
                this.name = name;
                this.age = age;
        }

        public boolean equals(Object obj)
        {

                if(!(obj instanceof Person))//判断传入的对象是不是Person的实例
                        return false;//如果不是返回false

                Person p = (Person)obj; // 将obj强制转换成Person类对象,因为bj是Person的实例,也就有可能是其子类对象。这样才能和Person类进行比较。
                //System.out.println(this.name+"....."+p.name);

                return this.name.equals(p.name) && this.age == p.age;
        }
        /**/
        public String getName()
        {
                return name;
        }
        public int getAge()
        {
                return age;
        }
}
                Person p = (Person)obj; // 这里 (Person)obj; 代表什么意思用意在何处 我一时理解不了?求解
作者: eycrckag    时间: 2013-5-23 18:20
强制转换,,会出现多态。。。
和  父类指向子类引用的效果是一样的。。
作者: 悟佛修道    时间: 2013-5-23 21:47
public boolean equals(Object obj)           这里的参数类型是父类Object ,那么你传入person后就自动向上提升到了父类类型,也就是说传进来person后
                                       就相当于是object obj=new person()父类引用指向子类对象。
  
{

                if(!(obj instanceof Person))
                        return false;

                Person p = (Person)obj; // 这里 (Person)obj; 代表什么意思 我一时理解不了?求解
           而这句话就是接着上面object obj=new person()这句的向下转型,因为当父类引用指向子类对象时,要调用子类里面的方法,必须向下转型。
           (Person)obj就是把obj这个父类引用转换成前面括号里面的person子类对象。还记得强制转换类型吗?比如在整数前面加个(char)就是强制转换成char类型,跟这个一个道理。



作者: 刘胜寒    时间: 2013-5-24 00:46
楼主你好,如果问题以解决,请修改分类,谢谢合作。
作者: 袁梦希    时间: 2013-5-24 00:49
楼主你好,如果问题以解决,请修改分类,谢谢合作。
作者: 小石头39910    时间: 2013-5-24 17:26
   public boolean equals(Object obj)
        {

                if(!(obj instanceof Person))//用instanceof关键字判断obj是不是Person的对象,如果不是的话就返回false
                        return false;

        Person p = (Person)obj; //判断obj是Person的对象,但是obj通过equals传的Object的一个对象,所以这里就涉及到了类型的转换问题,这里是高级类型向低类型转换,所以是向下转型 ,         
         //System.out.println(this.name+"....."+p.name);

                return this.name.equals(p.name) && this.age == p.age;
        }
作者: Super_Class    时间: 2013-5-24 22:06
对象的转型只会自动向上转型。但是不会自动向下转型。所以需要显式的转型


作者: 影响力147753321    时间: 2013-5-26 08:55
是用来把传入object强转为person,因为前面排除了不是person的情况,所以可以向下转型为person,目的是用来调用子类person特有属性name和 age。
作者: !=老王    时间: 2017-9-17 21:00
张世威 发表于 2013-5-23 11:11
if(!(obj instanceof Person))
                        return false;  //①通过这句,排除非Person实例 ...

谢谢____________________________!
作者: !=老王    时间: 2017-9-17 21:01
感谢分享!!!!!!!!!!!!!!




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