父类对象 到底能不能强转换为 子类对象
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<u=http%3A%2F%2Fbbs.csdn.net%2Ftopics%2F360056842<r=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<u=http%3A%2F%2Fbbs.csdn.net%2Ftopics%2F360056842<r=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<u=http%3A%2F%2Fbbs.csdn.net%2Ftopics%2F360056842<r=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 ? 只有强转后,方可调用自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引用是否为某个具体子类的实例 |
相关文章推荐
- 父类对象到底能不能强制转换为子类对象
- JAVA父类对象与子类对象-造型转换
- 类小结2:子类对象和父类对象的转换 final关键字 抽象类
- JAVA父类对象与子类对象-造型转换[转]
- java学习笔记:java的多态,子类和父类的相互转换,父类引用指向子类的对象
- 子类对象向父类对象转换的相关问题解析
- JAVA父类对象与子类对象-造型转换
- 父类和子类转换(子类对象赋值给父类对象)(转载)
- 关于继承(子类对象与父类对象【相互转换】的过程)
- 父类对象不能强行转换为子类对象
- 父类和子类转换浅谈篇(将子类对象赋值给父类对象)
- C#中 父类与子类相互强制转换之实验
- 父类引用指向子类对象
- java创建一个子类对象是会调用父类的构造方法会不会创建父类
- 子类实例初始化父类(接口)对象
- Java 中深层理解父类引用指向子类对象
- 父类引用指向子类对象
- 父类引用指向子类对象
- java 父类、子类 类型转换【父类不能转为子类】
- 父类和子类转换浅谈篇(将子类对象赋值给父类对象)