请教关于重写

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的方法?
...全文
100 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
仿QQ音乐播放器文件List控件 =================================== 一款界面类的源代码主要模仿QQ音乐播放器中的文件列表List控件界面。 以下是作者信息:在此感谢这位网友,有问题可以直接找作者沟通请教。 '联系QQ 506422660 'E-Mail Owhao@126.com 'QQ: 74XXX23 '如果没事请勿打扰 '只花费了一个早上,因为有前一个基础 '帮一个网吧写点歌系统,写了一个播放列表控件,因为是自己用,所以功能和样式都是固定的 '所以在前面的基础上,重写了这个播放列表 '【//修正信息: '//修正了一个BUG '//因为是急匆匆完成,我没有那么多时间去调试 '//现在发现的一个BUG就是绘画底部的项如果是空白的不会擦除 '//如果每次擦除,会闪烁,肯定是我的思路里有很大的BUG '//就是这个BUG,这个源码已经修正】 '我没时间去修改了(因为我是很懒的) '各位根据自己的要求,去修改吧。 '因为找不到QQ音乐的那个绿色的播放图标,打开下面的所有EXE、DLL、ICO、Image都找不到。。。 '所以用另外一个图标代替了。 '这个图标放在资源文件 TCICON 中的 PLAYICON 里。 '支持真彩色带 Alpha 通道的图标,替换只要替换这个资源就可以了 '替换后修改一下 Private Const ICON_SIZE As Long = 12 '图标的尺寸 ' 【版权声明】 '欢迎自由传播或者商业用途。但是请保留原作者 '最终版权归作者所有 2009-03-06 作者已经修复了几处BUG,请大家下载更新。感谢作者。

62,624

社区成员

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

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