标题:求教两个关于对象转型的问题
只看楼主
cj_yang
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2012-12-28
结帖率:100%
已结贴  问题点数:20 回复次数:4 
求教两个关于对象转型的问题
1.java在对象转型中,父类引用指向子类对象时,不能调用子类对象的方法,当将其强制转化为子类引用时就可以调用了,可以告诉我在转化前,父类引用里装的是个怎样的地址吗?或者说是一个怎样的指针??,转型后呢??

2.关于instanceof操作符有点疑问,比如说Cat是Animal的子类,以下代码片段中:
public void f(Animal a) {
    if (a instanceof Cat) {
        Cat cat = (Cat)a;
    }
}
向方法中传入一个Cat对象,然后a instanceof Cat成立了后,为什么还要把a进行强制转化呢,为什么就不能把a当做是Cat的一个引用呢?

初学者,问的问题可能有点蛋疼,不要介意啊。。

   
搜索更多相关主题的帖子: public 
2013-03-19 22:10
ren829
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:15
帖 子:255
专家分:1174
注 册:2006-3-11
得分:10 
无论父类还是子类的引用里边装的地址都没有区别,都是指向赋值给它的对象。只不过再向下转型之前,a的类型是Animal ,而转型之后,cat的地址复制了a的地址,而cat是Cat类型的。因为java是传递的都是引用地址,所以引用所指向的对象其实并没有区别。

a instanceof Cat 表示的是 a指向的对象确实是 Cat类型,但是它说明的是 a所指向的对象本身是Cat,但是a不是 a这个引用是Animal,所以你再传递引用的时候依然要对它强制转型。

求指导,理解是否正确。
2013-03-19 23:38
shellingford
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:19
帖 子:228
专家分:1348
注 册:2010-8-9
得分:10 
Cat cat =new Cat();
Animal a=cat;

cat和 a都指向同一个内存地址,也就是说和变量类型无关。

为什么Animal a 不能调用Cat的方法呢?这个是java语法或者说是编译器的检查问题,实际上是可以调用的(参考反射,比较复杂)。
非要强制转换一下有2个好处,一个是代码可读性高,任何对象都是Object的子类,如果没有这样的限制,那么直接声明Object就可以调任何方法了
第二个也是告知程序员在类型转换时注意确定类型,如果一个Animal实例强转Cat是会抛出异常的。

2013-03-20 10:05
cj_yang
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2012-12-28
得分:0 
回复 2楼 ren829
你说的我能理解。。谢了。。
2013-03-20 20:48
cj_yang
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2012-12-28
得分:0 
回复 3楼 shellingford
可以问一下楼上说的是正确的吗,你这样说我理解不了啊。。。
2013-03-20 20:54



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-401317-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.048677 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved