请教关于重写

tmhk123 2010-04-23 01:34:40
class Base{
int i =99;
public void amethod(){
System.out.println("Base.amethod()");
}
}
public class RType extends Base{
int i =-1;
public static void main(String []args){
Base b = new RType ();
System.out.println(b.i);
b.amethod();
}
public void amethod(){
System.out.println("RType.amethod()");
}
}

最后结果是:
99
RType.amethod()");

对于Base b = new RType ();这一句b到底是属于谁的对象?为什么b.i=99 但是却调用了RType的方法?
...全文
98 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
tmhk123 2010-04-24
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 keeya0416 的回复:]
对于Base b = new RType ();这一句b到底是属于谁的对象?
当然是子类的对象;即 RType
为什么b.i=99 但是却调用了RType的方法?
Java里方法是动态绑定的,不管引用是父类类型还是子类的
调用方法都是子类的(重写的方法);
至于为什么b.i=99 是因为父类的引用只能指向父类的成员
这里叫 擦除
想显示子类的属性 就得 ((RType) b).i ……
[/Quote]

说的很清楚
yueguangkai001 2010-04-24
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 beibuyangguang 的回复:]
b是父类的引用指向子类对象,b是在栈空间里的引用,面它所引用的是堆空间里的子类对象。
[/Quote]
这里的堆栈不是很清楚,但是第一句话,我比较赞同
beibuyangguang 2010-04-24
  • 打赏
  • 举报
回复
b是父类的引用指向子类对象,b是在栈空间里的引用,面它所引用的是堆空间里的子类对象。
yueguangkai001 2010-04-24
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 keeya0416 的回复:]
对于Base b = new RType ();这一句b到底是属于谁的对象?
当然是子类的对象;即 RType
[/Quote]
我怎么感觉都不像,如果是子类对象的话,如果子类中还有其他的一个方法
在RType中
class RType extends Base
{
other(){
}
}
你能够通过
b.other();访问么?
个人感觉应该是父类对象的引用
thr81111pp 2010-04-23
  • 打赏
  • 举报
回复
每日界分
cai_javastu 2010-04-23
  • 打赏
  • 举报
回复
对于Base b = new RType ();这一句b到底是属于谁的对象?
这里是多态,多态的条件有三个:继承、重写、父类的引用指向子类对象。这里满足这三个条件。所以b是类RType的对象
lulu0126 2010-04-23
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 keeya0416 的回复:]
对于Base b = new RType ();这一句b到底是属于谁的对象?
当然是子类的对象;即 RType
为什么b.i=99 但是却调用了RType的方法?
Java里方法是动态绑定的,不管引用是父类类型还是子类的
调用方法都是子类的(重写的方法);
至于为什么b.i=99 是因为父类的引用只能指向父类的成员
这里叫 擦除
想显示子类的属性 就得 ((RType) b).i ……
[/Quote]

tks

学习你的态度和技术!
hml1006 2010-04-23
  • 打赏
  • 举报
回复
不就是多态吗,
构造方法是谁的,构造的对象就是谁的,对象里的方法当然也是谁的
keeya0416 2010-04-23
  • 打赏
  • 举报
回复
对于Base b = new RType ();这一句b到底是属于谁的对象?
当然是子类的对象;即 RType
为什么b.i=99 但是却调用了RType的方法?
Java里方法是动态绑定的,不管引用是父类类型还是子类的
调用方法都是子类的(重写的方法);
至于为什么b.i=99 是因为父类的引用只能指向父类的成员
这里叫 擦除
想显示子类的属性 就得 ((RType) b).i ;
如果 RType b = new RType ();想调用父类的属性就得 ((Base)b).i 这叫恢复
其实b里有两个 i 在堆中以 super.i 和 this.i 分辨的
记着一句话
方法决定于对象类型

BTW 不建议在子类中用和父类同名的成员属性
同名属性决定于引用类型
WYhack 2010-04-23
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 bawgiitx 的回复:]

public void amethod()方法被覆盖
属性不能被覆盖
((RType) b).i == -1
[/Quote]

赞一个!
bawgiitx 2010-04-23
  • 打赏
  • 举报
回复
public void amethod()方法被覆盖
属性不能被覆盖
((RType) b).i == -1
guoliang2010 2010-04-23
  • 打赏
  • 举报
回复
Base b, 因为你初始化 Base的时候用RType ,所有要调用RType 的方法、
hbgzg3006 2010-04-23
  • 打赏
  • 举报
回复
属性没有多态,方法才有。
zuoguodang 2010-04-23
  • 打赏
  • 举报
回复
Base b

62,621

社区成员

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

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