您的位置:首页 > 其它

父类对象 到底能不能强转换为 子类对象

2016-10-20 09:15 295 查看


父类对象 到底能不能强转换为 子类对象 [问题点数:25分,结帖人huangyongmusic]

不显示删除回复 显示所有回复
显示星级回复 显示得分回复
只显示楼主

收藏





关注
huangyongmusic
huangyongmusic
本版等级:


结帖率:54.55%

楼主发表于: 2011-02-23 22:34:14

如A类、 B类 ,B extends A的

A a=new A();

B b=new B();

b=(B)a; //把父类对象强制转换为子类对象, 编译无错,执行时出错。

但是为什么书的

Graphics对象强制转换为Graphics2D对象后才能在屏幕上画图或文本?

Graphics2D类是Graphics类的子类,用来绘制2D图形,这句话的意思是把Graphics类的对象g,强制转换成Graphics2D类的对象g2d。

在struts 1.x中的 execute()方法中的四个参数就有 ActionForm form,在方法体中就要把

form这个父类对象,强制转换为自己设计的myForm类,myForm myform=(myForm) form; 才能获得传递的提交表单数据。

form是ActionForm来的, "RegForm也继承了ActionForm ",一定要强制类型转换才行!

这里父类对象强制转换为子类对象,

为什么我们在直接写A a=new A(); B b=new B(); b=(B)a; 就错了呢?

更多0分享到:

相关知识库: Hive 区块链 深度学习 React
Native

<iframe id="iframeu1636200_0" src="http://pos.baidu.com/scim?rdid=1636200&dc=2&di=u1636200&dri=0&dis=0&dai=3&ps=1198x371&dcb=BAIDU_SSP_define&dtm=HTML_POST&dvi=0.0&dci=-1&dpt=none&tsr=0&tpr=1476925633526&ti=%E7%88%B6%E7%B1%BB%E5%AF%B9%E8%B1%A1%20%E5%88%B0%E5%BA%95%E8%83%BD%E4%B8%8D%E8%83%BD%E5%BC%BA%E8%BD%AC%E6%8D%A2%E4%B8%BA%20%E5%AD%90%E7%B1%BB%E5%AF%B9%E8%B1%A1-CSDN%E8%AE%BA%E5%9D%9B-CSDN.NET-%E4%B8%AD%E5%9B%BD%E6%9C%80%E5%A4%A7%E7%9A%84IT%E6%8A%80%E6%9C%AF%E7%A4%BE%E5%8C%BA&ari=2&dbv=2&drs=3&pcs=1320x705&pss=1320x9038&cfv=0&cpl=5&chi=1&cce=true&cec=UTF-8&tlm=1476925634&rw=705&ltu=http%3A%2F%2Fbbs.csdn.net%2Ftopics%2F360056842&ltr=https%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3DKbkFmUchiO5tMf7RB3TXe60peGFyOfnNb-vaqef4rVekByrEMGFCO3QDNPf6MkI2%26wd%3D%26eqid%3De187b73a0004abc600000005580818a9&ecd=1&psr=1920x1080&par=1920x1040&pis=-1x-1&ccd=24&cja=false&cmi=7&col=zh-CN&cdo=-1&tcn=1476925634&qn=d6a83f3957fa6396&tt=1476925633508.611.967.969" width="200" height="22" align="center,center" vspace="0" hspace="0" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" allowtransparency="true" style="box-sizing: content-box; border-width: 0px; border-style: initial; vertical-align: bottom; margin: 0px;"></iframe>

<iframe id="iframeu1636201_0" src="http://pos.baidu.com/scim?rdid=1636201&dc=2&di=u1636201&dri=0&dis=0&dai=4&ps=1198x625&dcb=BAIDU_SSP_define&dtm=HTML_POST&dvi=0.0&dci=-1&dpt=none&tsr=0&tpr=1476925633526&ti=%E7%88%B6%E7%B1%BB%E5%AF%B9%E8%B1%A1%20%E5%88%B0%E5%BA%95%E8%83%BD%E4%B8%8D%E8%83%BD%E5%BC%BA%E8%BD%AC%E6%8D%A2%E4%B8%BA%20%E5%AD%90%E7%B1%BB%E5%AF%B9%E8%B1%A1-CSDN%E8%AE%BA%E5%9D%9B-CSDN.NET-%E4%B8%AD%E5%9B%BD%E6%9C%80%E5%A4%A7%E7%9A%84IT%E6%8A%80%E6%9C%AF%E7%A4%BE%E5%8C%BA&ari=2&dbv=2&drs=3&pcs=1320x705&pss=1320x9038&cfv=0&cpl=5&chi=1&cce=true&cec=UTF-8&tlm=1476925634&rw=705&ltu=http%3A%2F%2Fbbs.csdn.net%2Ftopics%2F360056842&ltr=https%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3DKbkFmUchiO5tMf7RB3TXe60peGFyOfnNb-vaqef4rVekByrEMGFCO3QDNPf6MkI2%26wd%3D%26eqid%3De187b73a0004abc600000005580818a9&ecd=1&psr=1920x1080&par=1920x1040&pis=-1x-1&ccd=24&cja=false&cmi=7&col=zh-CN&cdo=-1&tcn=1476925634&qn=ee4d6b6002c4baef&tt=1476925633508.612.923.924" width="200" height="22" align="center,center" vspace="0" hspace="0" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" allowtransparency="true" style="box-sizing: content-box; border-width: 0px; border-style: initial; vertical-align: bottom; margin: 0px;"></iframe>

<iframe id="iframeu1636204_0" src="http://pos.baidu.com/scim?rdid=1636204&dc=2&di=u1636204&dri=0&dis=0&dai=5&ps=1198x879&dcb=BAIDU_SSP_define&dtm=HTML_POST&dvi=0.0&dci=-1&dpt=none&tsr=0&tpr=1476925633526&ti=%E7%88%B6%E7%B1%BB%E5%AF%B9%E8%B1%A1%20%E5%88%B0%E5%BA%95%E8%83%BD%E4%B8%8D%E8%83%BD%E5%BC%BA%E8%BD%AC%E6%8D%A2%E4%B8%BA%20%E5%AD%90%E7%B1%BB%E5%AF%B9%E8%B1%A1-CSDN%E8%AE%BA%E5%9D%9B-CSDN.NET-%E4%B8%AD%E5%9B%BD%E6%9C%80%E5%A4%A7%E7%9A%84IT%E6%8A%80%E6%9C%AF%E7%A4%BE%E5%8C%BA&ari=2&dbv=2&drs=3&pcs=1320x705&pss=1320x9038&cfv=0&cpl=5&chi=1&cce=true&cec=UTF-8&tlm=1476925634&rw=705&ltu=http%3A%2F%2Fbbs.csdn.net%2Ftopics%2F360056842&ltr=https%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3DKbkFmUchiO5tMf7RB3TXe60peGFyOfnNb-vaqef4rVekByrEMGFCO3QDNPf6MkI2%26wd%3D%26eqid%3De187b73a0004abc600000005580818a9&ecd=1&psr=1920x1080&par=1920x1040&pis=-1x-1&ccd=24&cja=false&cmi=7&col=zh-CN&cdo=-1&tcn=1476925634&qn=14869f2e93988742&tt=1476925633508.613.943.946" width="200" height="22" align="center,center" vspace="0" hspace="0" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" allowtransparency="true" style="box-sizing: content-box; border-width: 0px; border-style: initial; vertical-align: bottom; margin: 0px;"></iframe>

对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
回复次数:24



关注
huangyongmusic
huangyongmusic
本版等级:


#1 得分:0回复于: 2011-02-23 22:34:56

一定要弄清楚它

对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理




关注
lujun1985
lujun1985
本版等级:


#2 得分:0回复于: 2011-02-23 22:41:19

Graphics2D类是Graphics类的子类,用来绘制2D图形,这句话的意思是把Graphics类的对象g,强制转换成Graphics2D类的对象g2d。

这样理解不正确,实际在运行的时候,得到的已经是Graphics2D的对象,只不过是用的父类的类型来引用它的。

类似的,在struts中,传递过来的已经是自定义的form对象。
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理




关注
huangyongmusic
huangyongmusic
本版等级:


#3 得分:0回复于: 2011-02-23 22:44:31

那就是说 父类对象是不可以强制转换 为子类对象喽?
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理




关注
barryhappy
barryhappy
本版等级:


#4 得分:0回复于: 2011-02-23 22:45:42

子类对象一般都比父类对象包含更多的东西……所以强制转换的结果…是不可预知的
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理




关注
huangyongmusic
huangyongmusic
本版等级:


#5 得分:0回复于: 2011-02-23 22:45:42

类似的,在struts中,传递过来的已经是自定义的form对象。

既都已经是子类对象,那又何必再强制转换呢?
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理




关注
huangyongmusic
huangyongmusic
本版等级:


#6 得分:0回复于: 2011-02-23 22:47:02

一个判断题,父类对象到底能不能强制转换为子类对象 请给个明确的回答,到底是能 还是不能
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理




关注
huangyongmusic
huangyongmusic
本版等级:


#7 得分:0回复于: 2011-02-23 22:49:33

请个明确的回答,能还是不能
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理




关注
kai27ks
kai27ks
本版等级:


#8 得分:10回复于: 2011-02-23 23:01:57

好吧。我来告诉你。可以。前提是:此父类对象为子类对象强转的结果 例如:

Father father = (Father)son;

当这种情况时,可以用instanceof判断是否是子类类型(实际) 然后强转回去

if(father instanceof Son)

Son son =(Son)father;

除此之外,不行。
对我有用[1] 丢个板砖[0] 引用 | 举报 | 管理




关注
kai27ks
kai27ks
本版等级:


#9 得分:0回复于: 2011-02-23 23:07:04

往深了讲。子类强制转换为父类对象时,并没有实际丢失它原有内存空间(比父类多的那些部分)只是暂时不可访问。所以能再转回来。

另:父类对象可接受任何子类对象--此时发生自动转型--》转为父类类型--》所以能够再转回来。用instanceof 是防止错误的一种方式。
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理




关注
yue19870813
Ituuz
本版等级:


#10 得分:0回复于: 2011-02-23 23:53:19

能 但没人这么做吧
对我有用[0] 丢个板砖[1] 引用 | 举报 | 管理




关注
liuchao1989
liuchao1989
本版等级:


#12 得分:0回复于: 2011-02-24 10:44:20

引用 8 楼 kai27ks 的回复:

好吧。我来告诉你。可以。前提是:此父类对象为子类对象强转的结果 例如:

Father father = (Father)son;

当这种情况时,可以用instanceof判断是否是子类类型(实际) 然后强转回去

if(father instanceof Son)

Son son =(Son)father;

除此之外,不行。
+1
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理




关注
bigc2001
bigc2001
本版等级:


#13 得分:0回复于: 2011-02-24 10:48:34

能,看具体的实例,如果实例化的是子类就可以:

Father f = new Son();

Son s = (Son)f;
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理




关注
dashuaishuiyun
dashuaishuiyun
本版等级:


#14 得分:0回复于: 2011-02-24 15:51:34

引用 13 楼 bigc2001 的回复:

能,看具体的实例,如果实例化的是子类就可以:

Father f = new Son();

Son s = (Son)f;

不是所有的父类都能转换成子类,只有上面的这种父类,他在新建对象的时候用的子类构造方法,,,才能转换.
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理




关注
wolfkoala
wolfkoala
本版等级:


#15 得分:0回复于: 2011-02-24 16:01:48

可以强转 但是可能会丢失一些东西
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理




关注
dracularking
科學信仰偉大生物科學
本版等级:




#16 得分:10回复于: 2011-02-24 16:26:53

同8楼,通俗来讲,不可能将一只是猫的动物强转为狗

再说Graphics2D:

Java code

?
g之所以能强转为Graphics2D,它的运行时实例应是两者(Graphics,Graphics2D)的共同子类,当然Graphics2D本身是Graphics的子类

只有强转后,方可调用自Graphics2D特有的方法如setRenderingHint

另外一点只有向下转型才需强转(explicit casting),向上转型是自动完成的,比如当你将一个子类对象赋给一个父类型变量时。

对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理




关注
mafly008
mafly008
本版等级:


#17 得分:0回复于: 2011-02-24 20:57:26

父类对象当然可以强制转换为子类对象
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理




关注
beblong
beblong
本版等级:


#18 得分:5回复于: 2011-02-24 21:49:44

给个例子你看下

Java code

?
张三(张三丰)、李四(李大姐)都是人,但随便拿到一个人,就强行认为其是男人或者女人就不合适了,类型转化是有风险的,除非你自己确切的明白,否则,即使你能欺骗编译器,也绝对欺骗不了虚拟机,因为,虚拟机是上帝。

以上是从哲学的角度去思考这个问题,从软件的角度,请参照9楼
对我有用[0] 丢个板砖[1] 引用 | 举报 | 管理




关注
beblong
beblong
本版等级:


#19 得分:0回复于: 2011-02-24 21:51:57

另外,你的疑惑是你确实看到了父类转子类并且成功的例子,其实你可以把等号右边的结果对象类型打印出来看,就知道事实了。必定是等号左边所申明类型极其子类。
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理




关注
vivazhao
vivazhao
本版等级:


#20 得分:0回复于: 2011-02-25 10:08:07

向下转是安全的,向上转是非安全的,转都可以转,但是你调用父类中没有的方法,那肯定会出错,因为实际运行的时候还是要看你这个new出来的对象中是否有这方法
对我有用[1] 丢个板砖[0] 引用 | 举报 | 管理




关注
beblong
beblong
本版等级:


#21 得分:0回复于: 2011-03-08 15:07:46

LZ的结贴率怎么这么离谱~~~
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理




关注
joknm
joknm
本版等级:


#22 得分:0回复于: 2011-03-08 17:06:11

父类不是可以转换为子类的。

Father f = new Son();

这是一个上传引用,并不是父类生成的一个实例。

类型引用可以进行强制类型转换的,但有可能会产生ClassCastExcept异常。

如Son son = (Son)object; // object可能是用Object 父类去引用一个子类。

在这种不可预知的类型转换时应该对引用进行一个测试:

if(object instanceof Son){

Son son = (Son)object;

}

以防止ClassCastExcept异常
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理




关注
joknm
joknm
本版等级:


#23 得分:0回复于: 2011-03-08 17:08:31

晕倒不支持编辑。上面打错了,应该是:

父类是不可以强制转换为子类的。因为jvm不支持,哈哈。

对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理




关注
agan22
agan22
本版等级:


#24 得分:0回复于: 2011-11-25 10:23:47

引用 8 楼 kai27ks 的回复:

好吧。我来告诉你。可以。前提是:此父类对象为子类对象强转的结果 例如:

Father father = (Father)son;

当这种情况时,可以用instanceof判断是否是子类类型(实际) 然后强转回去

if(father instanceof Son)

Son son =(Son)father;

除此之外,不行。

//----------------

刚做了个OOAD小案例,总结下这种父子类多态的关系:

1)Father father = new Son();//可以

2)8楼说的Father father = (Father)son; Son son =(Son)father;//语法上可以

但是即使这样Son son =(Son)father;转换回来 son也调用不了Son类的内容了!son对象本身已经没有实际意义

3)唯一的用处:if(father instanceof Son) 用于判断father引用是否为某个具体子类的实例

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: