黑马程序员技术交流社区

标题: 小白请教关于object多态转型的问题 [打印本页]

作者: 立志转行    时间: 2015-5-19 22:05
标题: 小白请教关于object多态转型的问题
下面是毕老师讲的关于调用object中比较方法的程序
class Demo
{
        private int num;
        Demo(int num)
        {
                this.num = num;
        }
        public boolean equals(Object obj)//Object obj = new Demo();Object obj = new Persion();多态
        {               
                Demo b = (Demo) obj;
                return this.num == b.num;
        }
}
class Persion
{
}
class ObjectDemo
{
        public static void main(String[] args)
        {
                Demo d1 = new Demo(4);
                Demo d2 = new Demo(6);
                Persion p = new Persion();
                System.out.println(d1.equals(p));
进行编译的时候没问题,运行的时候报错,persion无法转换为demo。问题来了?
问:定义的Object obj = new Persion();说明obj虽然是对象persion中的,但它所属类是Object,Demo又继承了Object,理论上obj可以转换成Demo啊?
为什么说persion无法转换为demo?附图说明我的想法。大神帮我看看我那儿理解错了~
如图:Object obj = new Demo();说明obj属于阴影部分的,类属于Object但也是Demo中的一部分,所以可以转换成Demo。
Object obj = new Persion();说明obj也属于阴影部分,也是Demo中的一部分为什么不能转换成Demo呢?

捕获.PNG (5.87 KB, 下载次数: 18)

捕获.PNG

作者: pvbj0314    时间: 2015-5-19 22:13
应该是Demo和Person都属于Object,而Demo和Person之间没有交集。Demo是Object的子类,Person也是Object的子类。既然Person不属于Demo,自然也无法转换成Demo。
作者: 立志转行    时间: 2015-5-19 22:18
pvbj0314 发表于 2015-5-19 22:13
应该是Demo和Person都属于Object,而Demo和Person之间没有交集。Demo是Object的子类,Person也是Object的子 ...

默认的所有类不都是继承的Object这个父类吗?Object应该是Demo和Persion的子集吧?
作者: pvbj0314    时间: 2015-5-19 22:26
立志转行 发表于 2015-5-19 22:18
默认的所有类不都是继承的Object这个父类吗?Object应该是Demo和Persion的子集吧? ...

黑马是马,白马也是马,那么黑马和马,谁是子集,谁是父集?
作者: 立志转行    时间: 2015-5-19 22:30
pvbj0314 发表于 2015-5-19 22:26
黑马是马,白马也是马,那么黑马和马,谁是子集,谁是父集?

按继承说应该是黑马是父类,马是子类,子类继承了父类所以范围应该大于父类
但是按提取的说,白马和黑马的共性都是马,父类应该是马!!!彻底蒙圈了!
作者: zhw634631    时间: 2015-5-19 22:43
Object所有类父类
作者: 立志转行    时间: 2015-5-19 22:46
zhw634631 发表于 2015-5-19 22:43
Object所有类父类

是啊,但是我的问题出在那儿?
作者: pvbj0314    时间: 2015-5-20 20:16
立志转行 发表于 2015-5-19 22:46
是啊,但是我的问题出在那儿?

答案不是在第一次回答时写了吗?用黑马代替Demo类,白马代替Person类,马代替Object类,另外假设小黑马是黑马的子类,黑马中有成员变量black,小黑马中另有成员变量small,白马中有成员变量white。这样,你可以说小黑马的对象是黑马,但不能说白马的对象是黑马。所以黑马引用可以指向黑马的对象,也可以指向小黑马。而无论怎样,黑马引用是不可能指向白马的。
你的Demo实际上等同于将白马的对象转换为黑马,当然不可以。但你可以将小黑马对象转换为黑马,而这个转换实际不需要强制转换,因为小黑马也是黑马。如果你是将指向小黑马的黑马引用内容赋值给一个小黑马引用,则需要告诉编译器这个黑马引用指向的是小黑马对象,就需要用类型转换的操作。
作者: ljc979508577    时间: 2015-5-20 20:31
object是所有类的父类,子类继承父类,但是子类之间不可以相互转换,父类和之类之间可以,就是这样,




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