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

class A{
void a(){
System.out.println("a()");
}
}

class B extends A{
void b(){
System.out.println("b()");
}
}

public class C {
public static void main (String[] args) {
A[] test={
new A(),
new B()
};

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

搜索更多相关主题的帖子: 令人不解 void class 
2007-08-01 17:19
l3294832
Rank: 1
等 级:新手上路
帖 子:49
专家分:0
注 册:2007-7-29
收藏
得分:0 
对于一个引用类型的变量,编译时编译器按照它声明的类型处理
test[1].b();所以这句编译时就会有问题,因为声明的类型是A,而A无void b()这个方法,自然报错

2007-08-01 17:41
huwangvs
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:34
帖 子:764
专家分:0
注 册:2007-2-4
收藏
得分:0 
test[0].b();我怎么不理解呢???
A里面有b()方法吗???

对于test[1].b();因为是用A类型的数组存储的,所以它变成了A类型。A类型不能调用它子类的方法。必须转原型后才行。
2007-08-01 17:42
l3294832
Rank: 1
等 级:新手上路
帖 子:49
专家分:0
注 册:2007-7-29
收藏
得分:0 
//test[0].b();这个大家都能理解
他的意思是说这句编译也不通过

2007-08-01 17:44
弑神饕餮
Rank: 1
等 级:新手上路
帖 子:85
专家分:0
注 册:2007-6-6
收藏
得分:0 

哦啊 谢谢两位啊
还是编译器不够聪明 嘿嘿~~~


爱情如潮水般滚滚迩来,总有一天滚滚滚回去!!天长地久惟有java!
2007-08-01 17:46
huwangvs
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:34
帖 子:764
专家分:0
注 册:2007-2-4
收藏
得分:0 

你把B里面的方法b()改成a()
它就聪明了

2007-08-01 17:52
J华
Rank: 1
等 级:新手上路
帖 子:50
专家分:0
注 册:2007-7-2
收藏
得分:0 
A test=new B();C++里这是多态应用..java里多态的实现不是用接口吗?

A test=new B(); 这个在java中能通过的话 又指什么?
2007-08-01 17:54
heilong
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:777
专家分:0
注 册:2007-6-7
收藏
得分:0 
test[0] test[1]它都是A的一个句柄.而A里没有b()这个方法,它怎么能通过呢?
我就想不通,你是怎么想的.

风水鸡蛋壳,财去人安乐!----->
2007-08-01 18:24
狂放不羁
Rank: 4
等 级:贵宾
威 望:12
帖 子:925
专家分:0
注 册:2007-1-24
收藏
得分:0 

好好理解多态吧。。如果那样还叫多态吗?

2007-08-01 18:56
狂放不羁
Rank: 4
等 级:贵宾
威 望:12
帖 子:925
专家分:0
注 册:2007-1-24
收藏
得分:0 
哈哈 。test[0].b(). 这是不行的?为什么呢?因为A里面没有定义b(),基类和子类共有的东西才能多态。。。你的b()在A里有都没有怎么可以调用。呵呵
其次所谓的向下转型是把基类指向子类的引用转化为子类引用。你的test[0]本身就是A,怎么转化为A,
就好比说:汽车可以是汽车,这话有意义吗?只有说汽车可以是林肯也可以是劳斯莱斯才有意思。要想向
下转型首先要保证基类引用指向的是子类对象。这样才可以转。
2007-08-01 19:16
快速回复:[讨论]令人不解的向下转型
数据加载中...
 
   



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

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