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

huangyongmusic 2011-02-23 10: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; 就错了呢?
...全文
14104 24 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
agan22 2011-11-25
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 kai27ks 的回复:]
好吧。我来告诉你。可以。前提是:此父类对象为子类对象强转的结果 例如:
Father father = (Father)son;
当这种情况时,可以用instanceof判断是否是子类类型(实际) 然后强转回去
if(father instanceof Son)
Son son =(Son)father;
除此之外,不行。
[/Quote]
//----------------
刚做了个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引用是否为某个具体子类的实例


joknm 2011-03-08
  • 打赏
  • 举报
回复
晕倒不支持编辑。上面打错了,应该是:

父类是不可以强制转换为子类的。因为jvm不支持,哈哈。
joknm 2011-03-08
  • 打赏
  • 举报
回复
父类不是可以转换为子类的。
Father f = new Son();
这是一个上传引用,并不是父类生成的一个实例。
类型引用可以进行强制类型转换的,但有可能会产生ClassCastExcept异常。
如Son son = (Son)object; // object可能是用Object 父类去引用一个子类。
在这种不可预知的类型转换时应该对引用进行一个测试:
if(object instanceof Son){
Son son = (Son)object;
}
以防止ClassCastExcept异常
焙焙龙 2011-03-08
  • 打赏
  • 举报
回复
LZ的结贴率怎么这么离谱~~~
vivazhao 2011-02-25
  • 打赏
  • 举报
回复
向下转是安全的,向上转是非安全的,转都可以转,但是你调用父类中没有的方法,那肯定会出错,因为实际运行的时候还是要看你这个new出来的对象中是否有这方法
比特灵 2011-02-24
  • 打赏
  • 举报
回复
能,看具体的实例,如果实例化的是子类就可以:

Father f = new Son();

Son s = (Son)f;
liuchao1989 2011-02-24
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 kai27ks 的回复:]
好吧。我来告诉你。可以。前提是:此父类对象为子类对象强转的结果 例如:
Father father = (Father)son;
当这种情况时,可以用instanceof判断是否是子类类型(实际) 然后强转回去
if(father instanceof Son)
Son son =(Son)father;
除此之外,不行。
[/Quote]+1
焙焙龙 2011-02-24
  • 打赏
  • 举报
回复
另外,你的疑惑是你确实看到了父类转子类并且成功的例子,其实你可以把等号右边的结果对象类型打印出来看,就知道事实了。必定是等号左边所申明类型极其子类。
焙焙龙 2011-02-24
  • 打赏
  • 举报
回复
给个例子你看下

人 张三 = new 男人();
男人 张三丰 = (男人)张三 ; // “张三”是“张三丰”的小名

//=================
人 李四 = new 女人();
女人 李大姐 = (女人)李四;// 同上

//=================
人 张三 = new 男人();
女人 李大姐 = (女人)张三; //这里错了


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

以上是从哲学的角度去思考这个问题,从软件的角度,请参照9楼
mafly008 2011-02-24
  • 打赏
  • 举报
回复
父类对象当然可以强制转换为子类对象
dracularking 2011-02-24
  • 打赏
  • 举报
回复
同8楼,通俗来讲,不可能将一只是猫的动物强转为狗
再说Graphics2D:


class MyCanvas extends JComponent {
public void paint(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
Font font = new Font("Serif", Font.PLAIN, 96);
g2.setFont(font);

g2.drawString("jade", 40, 120);
}
}

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

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

另外一点只有向下转型才需强转(explicit casting),向上转型是自动完成的,比如当你将一个子类对象赋给一个父类型变量时。
wolfkoala 2011-02-24
  • 打赏
  • 举报
回复
可以强转 但是可能会丢失一些东西
dashuaishuiyun 2011-02-24
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 bigc2001 的回复:]

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

Father f = new Son();

Son s = (Son)f;
[/Quote]

不是所有的父类都能转换成子类,只有上面的这种父类,他在新建对象的时候用的子类构造方法,,,才能转换.
ituuz 2011-02-23
  • 打赏
  • 举报
回复
能 但没人这么做吧
kai27ks 2011-02-23
  • 打赏
  • 举报
回复
往深了讲。子类强制转换为父类对象时,并没有实际丢失它原有内存空间(比父类多的那些部分)只是暂时不可访问。所以能再转回来。
另:父类对象可接受任何子类对象--此时发生自动转型--》转为父类类型--》所以能够再转回来。用instanceof 是防止错误的一种方式。
kai27ks 2011-02-23
  • 打赏
  • 举报
回复
好吧。我来告诉你。可以。前提是:此父类对象为子类对象强转的结果 例如:
Father father = (Father)son;
当这种情况时,可以用instanceof判断是否是子类类型(实际) 然后强转回去
if(father instanceof Son)
Son son =(Son)father;
除此之外,不行。
huangyongmusic 2011-02-23
  • 打赏
  • 举报
回复
请个明确的回答,能还是不能
huangyongmusic 2011-02-23
  • 打赏
  • 举报
回复
一个判断题,父类对象到底能不能强制转换为子类对象 请给个明确的回答,到底是能 还是不能
barryhappy 2011-02-23
  • 打赏
  • 举报
回复
子类对象一般都比父类对象包含更多的东西……所以强制转换的结果…是不可预知的
huangyongmusic 2011-02-23
  • 打赏
  • 举报
回复
类似的,在struts中,传递过来的已经是自定义的form对象。

既都已经是子类对象,那又何必再强制转换呢?
加载更多回复(3)

81,122

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧