| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1328 人关注过本帖
标题:[讨论]令人不解的向下转型
只看楼主 加入收藏
弑神饕餮
Rank: 1
等 级:新手上路
帖 子:85
专家分:0
注 册:2007-6-6
收藏
得分:0 

我晕 我就不一个一个回了 下面我一起说

1
//test[0].b();这个大家都能理解
2 //test[1].b();奇怪就奇怪在这,我觉得应该可以,可是编译器不让我这么做,我看它还不够聪明
3 try{
4 ((B)test[0]).b();//类型不匹配不允许向下转型
5 }catch(java.lang.ClassCastException e){
6 System.out.println("can't cast");
7 }
8 ((B)test[1]).b();//传说中的向下转型
9 }
10}

很多人不理解我第1行的做法,我真晕了,我也知道A里没这个方法,所以我都把他注释掉了嘛,而且后面跟一句大家都能理解,我真晕,结果大家都不理解。。。我就是随便这么一写这个代码,为了突出第2行我模糊的地方。。。

还有LS啊,你仔细看一下第4行,我是把A转型为B,不是把A转成A。。。


爱情如潮水般滚滚迩来,总有一天滚滚滚回去!!天长地久惟有java!
2007-08-02 08:40
千里冰封
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:灌水之王
等 级:版主
威 望:155
帖 子:28477
专家分:59
注 册:2006-2-26
收藏
得分:0 
你把A B的对象都赋给了A,这个时候,对于编译器来说,它们都是A的对象,因为A里面并没有b()这个方法,所以你那个做当然编译不过,JAVA的多态是在运行的时候才体现出来的
比如如下

[CODE]class A{
public void doSth(){
System.out.println("A.doSth()");
}
}
class B extends A{
public void doSth(){
System.out.println("B.doSth()");
}
}
public class Test{
public static void main(String[] args) {
A[] as=new A[]{new A(),new B()};
for(A a:as){
a.doSth();
}
}
}[/CODE]

这个时候你看一下会输出什么就知道什么叫多态了,对于编译来说,as只是两个A的对象而已,但是运行的时候,JVM却知道as里面其实还包含 了一个B的对象,所以这个时候,它调用的方法就是在B里面的doSth方法,而不是定义在A里面的doSth方法,这样做才能更好的抽象出来,定义好一个父类,给定一个方法,然后子类各自有各自不同的实现,并且所有的子类都可以用父类的容器装起来,统一调用那个约定好的方法,运行的时候,就能体现出来了.

多经典的设计

可惜不是你,陪我到最后
2007-08-02 09:20
弑神饕餮
Rank: 1
等 级:新手上路
帖 子:85
专家分:0
注 册:2007-6-6
收藏
得分:0 
千里大哥说的我明白,我在这讲向下转型,你咋给我说起向上转型来了。。。



好了好了,谢谢各位的帮忙啦~~~~这个帖子结贴了啊,都表回了。。。再回还指不定扯哪去了。。。

爱情如潮水般滚滚迩来,总有一天滚滚滚回去!!天长地久惟有java!
2007-08-02 11:06
千里冰封
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:灌水之王
等 级:版主
威 望:155
帖 子:28477
专家分:59
注 册:2006-2-26
收藏
得分:0 
那就是你的表述有问题了

并且向下转型更简单啊

加个括号就以了,运行的时候,能转就转,不能转就抛一下ClassCastException

可惜不是你,陪我到最后
2007-08-02 13:27
千里冰封
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:灌水之王
等 级:版主
威 望:155
帖 子:28477
专家分:59
注 册:2006-2-26
收藏
得分:0 
2 //test[1].b();奇怪就奇怪在这,我觉得应该可以,可是编译器不让我这么做,我看它还不够聪明

这就是你所说的向下转型,你不转型,编译器怎么可以会允许你这样做呢?

对于编译器来说,test[0],test[1]都是A的对象,它哪里会知道你放了一个B对象在里面.事实上B也可以说是A的对象

所以这个时候,你从test里面取出来的对象,编译器只能让你调用A的方法.即使你是B也不行.否则就很容易出错,

如果你确实想要调用B的方法,你可以把它转型为B,这个时候编译器就认为是你要强制转成B的,它就不管了,这个时候就

由运行时的JVM来管了,运行的时候,它如果发现确实是可以转成B的,那当然最好啦,如果它发现这根本就不是B的对象,它

就会抛出一个ClassCastException了,

JAVA不是javasrcipt,JAVA是一个强制性的语言


可惜不是你,陪我到最后
2007-08-02 13:34
弑神饕餮
Rank: 1
等 级:新手上路
帖 子:85
专家分:0
注 册:2007-6-6
收藏
得分:0 
回复:(千里冰封) 2 //test[1].b();奇怪就奇怪在这...
哦 明白了~~~~~~~

爱情如潮水般滚滚迩来,总有一天滚滚滚回去!!天长地久惟有java!
2007-08-02 18:32
快速回复:[讨论]令人不解的向下转型
数据加载中...
 
   



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

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