父类和子类的方法

freewind 2011-08-06 12:03:10
定义两个类Person,Student. Student是Person的子类
Student中有一个方法 void geta();

Person p=new Person();

为什么这样可以: (Student)p.geta();



而这样不可以? :
p=(Student)p;
p.geta();
...全文
156 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
freewind 2011-08-06
  • 打赏
  • 举报
回复
    private EntityID getEntrance(EntityID b){
StandardEntity e=this.model.getEntity(b);
if(e instanceof Building){
List<Edge> edges=((Building)e).getEdges(); //这行有问题
for(Edge e1:edges){
if(e1.isPassable()){
EntityID temp=e1.getNeighbour();
return temp;
}
}
return null;
}
else return null;
}


这样是对的。
如果变成
e=(Building)e
List<Edge> edges=e.getEdges();

就编译出错。

错误原因:The method getEdges() is undefined for the type StandardEntity
freewind 2011-08-06
  • 打赏
  • 举报
回复

private EntityID getEntrance(EntityID b){
StandardEntity e=this.model.getEntity(b);
if(e instanceof Building){
List<Edge> edges=((Building)e).getEdges();
for(Edge e1:edges){
if(e1.isPassable()){
EntityID temp=e1.getNeighbour();
return temp;
}
}
return null;
}
else return null;
}


luoye17 2011-08-06
  • 打赏
  • 举报
回复
可以把子类转化为父类,Person p=new Person();p中好像没有geta()。代码全部贴一下看看
qybao 2011-08-06
  • 打赏
  • 举报
回复
Person p=new Person();
为什么这样可以: (Student)p.geta(); //你确信这样能行?应该出问题

Person p=new Student();
(Student)p.geta(); //这样才可以

p是Person类型的变量,但是指向Student实例,所以(Student)p这样向下转换没问题,即相当于某个临时变量 Student s = (Student)p; 然后通过临时变量调用 s.geta();

p=(Student)p; //这个p还是Person类型的变量,注意这里和上面的临时变量的区别
p.geta(); //所以编译期间编译器不能知道p有geta方法,所以编译没法通过



安卓机器人 2011-08-06
  • 打赏
  • 举报
回复
呵呵,楼上的哥哥们多数是正解
Tobe 2011-08-06
  • 打赏
  • 举报
回复

Person p=new Person();

为什么这样可以: (Student)p.geta(); //貌似编译错误。

正确的形式是: Person p = new Student(); p.geta();
p=(Student)p;
p.geta(); // 父类 = 子类 子类 = (子类)父类
// 类型转换之前 - 明确确定其具体指向
// 这样,我打个比方: 学生是人吧,但人一定是学生么?
LZ何必把人强制转换为学生呢?
xybcrab 2011-08-06
  • 打赏
  • 举报
回复
向上转型 Building要有getEdges的方法才可以调用吧
我嘞个去 2011-08-06
  • 打赏
  • 举报
回复
daijope 2011-08-06
  • 打赏
  • 举报
回复
有点抽象,其他类怎么定义的不知,编译对了,执行不一定对。
ydj552110737 2011-08-06
  • 打赏
  • 举报
回复
看下多态 ,我感觉lz是想说多态吧?父类引用指向子类对象
freewind 2011-08-06
  • 打赏
  • 举报
回复
人之所以要转化位学生,因为学生中有人没有的方法。比如geta()
我贴出来的源代码,可以看出来,传过来的对象是一个父类对象 StandardEntity。想用到子类对象getEdges的方法,因为父类里面没有getEdges(),需要转型是吧。然后我就这样做了/
我就想问:
e=(Building)e
List<Edge> edges=e.getEdges();


List<Edge> edges=((Building)e).getEdges();

有什么区别?
为什么一个对,一个不对?
谢谢大家了。

[Quote=引用 9 楼 chnrosin 的回复:]
Person p=new Person();

为什么这样可以: (Student)p.geta(); //貌似编译错误。

正确的形式是: Person p = new Student(); p.geta();
p=(Student)p;
p.geta(); // 父类 = 子类 子类 = (子类)父类
// 类型转换之前 - ……
[/Quote]

62,635

社区成员

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

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