[求助]一道关于override和继承的题目

franky82 2006-12-20 10:56:49
class X
{
int i;
X()
{
System.out.println(i);
add(1);
System.out.println(i);
}

void add(int v)
{
System.out.println("The add of X is called.");
i = v + i;
}

void print(){System.out.println(i);}
}

class Y extends X
{
Y()
{
System.out.println(i);
add(2);
System.out.println(i);
}

void add(int v)
{
System.out.println("The add of Y is called.");
i = i+ v*2;
}
}

public class override
{
public static void main(String[] args)
{
boogo(new Y());
}
static void boogo( X a)
{
a.add(8);
a.print();
}
}

/**输出结果为
* 0
* The add of Y is called.
* 2
* 2
* The add of Y is called.
* 6
* The add of Y is called.
* 22
**/

可是为什么不是
/**输出结果为
* 0
* The add of Y is called.
* 4 //这里不是调用Y中add的i = i + v * 2么?那就应该是4了啊
* 4
* The add of Y is called.
* 8
* The add of Y is called.
* 24
**/
...全文
132 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
franky82 2006-12-23
  • 打赏
  • 举报
回复
不好意思 我终于懂了
在X中的add(1);处调用了Y的add方法
franky82 2006-12-23
  • 打赏
  • 举报
回复
楼上所说:
由于Y实现了重写了add函数,所以这里调用的是Y的add函数,所以打出来的是2.
可是调用Y中的add函数,i=i+v*2
那么就应该打出来是4啊

或者按楼上的楼上的解释:给方法传参数时是值传递,传过去的是i的副本,方法外的i没有改变。

那么The add of Y is called.之后应该还是打出0了???
GemScorpio 2006-12-20
  • 打赏
  • 举报
回复
正确顺序是这样的,要初始化Y,首先要调用X的构造函数.
在X里的构造函数里面,第一句话打印的是默认的初始化的x的值,就是零.
紧接着调用add(1),由于Y实现了重写了add函数,所以这里调用的是Y的add函数,所以打出来的是2.其它的就不要我解释了吧
zuoky 2006-12-20
  • 打赏
  • 举报
回复
Java在给方法传参数时是值传递,传过去的是i的副本,方法外的i没有改变。

50,530

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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