请教面向对象基础问题:能否把父类对象直接转为子类对象?

nt941 2003-08-24 04:30:52
比如有A、B两个类,它们几乎完全相同,只有一个方法(比如method2)的定义B与A不同,于是让B继承A,并在B中重载method2。

假设后面的程序中得到了一个A的对象,可是我想让这个对象的method2方法表现出B的特性,于是我想把这个A的对象转变成B的对象,我想到了用强制类型转换的方法,可是试验失败了,请高手告诉我到底应该怎么转。

另外,继承的时候子类必须定义构造函数,是吗?我不定义的时候jbuilder就提醒我错误。

请高手指教,谢谢!!!

例:
假设两个类的定义如下:
class A {
public A(int a,int b) {
.........
}
public method1() {
.........
}
public method2() { //该方法的定义是A和B类唯一的不同
.........
}
}

class B extends A { //B是A的子类
public B(int a,int b) { //这个构造函数非写不可,是吗?
super(a,b);
}
public method2() { //重载父类的方法
......... //重新定义
}
}

假如后面的操作中从一Vector中取出了一个A的对象a,可是我希望a.method2()进行B类中定义的操作,于是我想进行如下的“强制类型转换”:
B b = (B)Vector.elementAt(1); //不能直接这么转吗?
可是编译的时候出现“ClassCastException”错误。

我的写法问题在哪里?请高手指教。
谢谢!
...全文
422 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
bbdeng 2003-08-24
  • 打赏
  • 举报
回复
上溯造型 :upcast向上转型。

楼主的设计有问题,B和A之间是is a关系吗?不是的话就不要用继承。
fpwang 2003-08-24
  • 打赏
  • 举报
回复
好像有个 上溯造型 的概念
不知何这个有没有关系,记不清了,应该是在 JAVA编程思想 里看到的
Abib 2003-08-24
  • 打赏
  • 举报
回复
这就像你随便从鸡笼里抓了一只鸡叫他生蛋,抓了个母鸡还好,抓了个公鸡你想怎么着?
如果楼主在应用中遇到需要这样转换的情形,肯定是设计问题了
zhaoxichao 2003-08-24
  • 打赏
  • 举报
回复
父类不能转子类
构造函数可以不写
jkit 2003-08-24
  • 打赏
  • 举报
回复
上面说的是对的。
你想访问B类的方法只能new 一个B类的对象出来。
A a = new B();
a.method2() 访问的就是B类的方法,不需要类型转化。
whyxx 2003-08-24
  • 打赏
  • 举报
回复
不能这样转,如果父类对像在new出来的时候是父类对像好他永远只能是父类对像,

如果是这样用的就可以转
A temp = new B();
那就可以用

B dddb = (B)temp;
ClassCastException这个错就是指强制转换时类型不匹配
artisanhe 2003-08-24
  • 打赏
  • 举报
回复
父类不可以向子类强制类型转换,这个好像没什么好说的吧,但是如果父类对象的运行时类型(run-time type)是子类类型,该转换是允许的。
例如:
A a = new B();//B是A的子类,a的编译时类型(compile-time type)为A,运行时类型为B
B b = (B)a;
你上面的例子属于运行时类型为父类的对象向子类转换,是不可以的。

那个构造函数必须有么?我没仔细看,是不是你在什么地方用到new B(1,2)之类的了?

62,612

社区成员

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

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