A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 rslheima 于 2012-6-19 17:23 编辑

  • public class GetXY {
  •         int x;
  •         int y;
  • public int sum(int x,int y){
  •         this.x=x;
  •         y=y;//   没用this.y=y;
  •         return x+y;
  •          //return this.x+this.y;// 为什么这样写不正确?
  •         //return this.x+y;//正确
  • }
  • public static void main(String [] args){
  •         GetXY  get=new GetXY();
  •         System.out.println(get.sum(2,4));
  • }
  • }

翻开以前的课本发现一个大问号,看看了还是不太明白,谁能帮忙解决一下?

当把第七行注释,使用第八行时为什么不是正确答案??

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

7 个回复

倒序浏览
楼主仔细查看代码遍可以找到问题所在。

System.out.println(get.sum(2, 4)); 将调用sum方法把2,4传入,这时在sum方法中存在的有this.x和this.y两个成员变量外还有x和y两个局部变量,当使用return x + y; 是两个局部变量相加的结果,传入的是2,4所以返回6也是对的。
而 return this.x+this.y;  这里返回为什么是2呢? 因为在sum方法开始时你把x变量的值赋给了this.x成员变量,而没有给this.y赋值。java给其初始化的值是0.所以相加返回的结果是2.


评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 耿鑫 于 2012-6-19 17:07 编辑

不用着急 听我慢慢给你讲
首先this指的是当前对象的引用 this.x 和this.y指的是两个成员变量x,y   sum(int x,int y)是两个参数xy, 接下来是为成员变量xy赋值 this.x = x;这没得说,y=y 这相当于一句废话,这里的y就是你传过来的参数y而不是成员变量this.y, y可不就是等于y嘛。接下来为什么this.x + this.y 和期望的结果不一样?是因为成员变量this.y根本就没有初始化,没有赋值,系统默认的值是0,所以你会看到返回的结果是2;this.x + y为什么和结果正确我想你应该明白了,成员变量被初始化为2,所以this.x = 2 ,y是你传过来的参数值为4,所以返回的结果是6;

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
唐辉辉 发表于 2012-6-19 16:56
楼主仔细查看代码遍可以找到问题所在。

System.out.println(get.sum(2, 4)); 将调用sum方法把2,4传入,这 ...

喔,确实是,在sum(int x ,int y),就已经声明了两个局部变量,呵呵,糊涂啦!
回复 使用道具 举报
耿鑫 发表于 2012-6-19 17:05
不用着急 听我慢慢给你讲
首先this指的是当前对象的引用 this.x 和this.y指的是两个成员变量x,y   sum(int  ...

呵呵,明白了,谢谢回答!
回复 使用道具 举报
/*这个地方其实主要是看对this这个关键字的理解有没有到位:
this代表的是本类对象的引用;
return x+y;是通过给方法传递参数的形式对x .y进行了初始化;
return this.x+y; 这个初始化过程是两个;第一this.x这代表的是GetXY对象的成员变量;this.x=x; 这个的意思是
通过给方法传递参数的形式给对象完成了初始化、这个时候。GetXY的成员变量x(也就是this.x=2)的值为2;sum方法的y
它不是它不是成员变量,它是局部变量,通过sum(2,4);的方法给它赋了值为4,也就是说这个时候的输出结果是成员变量的
x(2)加上了局部变量的y(4)的和,所以打印了6;
明白了上一个的原因:
return this.x=this.y的结果就会好理解很多;
同样的道理;this.x被赋值为x;这个时候的y虽然也被赋了值,但它是局部变量,return的是this.x和this.y就对象的成员变量
x,y的和;可以看到自始至终成员变量y都没有被赋值,所以的它的值仍然默认初始化值;即y=0;
注意:y=y; 这是通过给函数传递参数的形式给局部变量y赋了值;这和成员变量的y,即this.y没有关系;
你可以通过return y; 和return this.y的方式验证;
另外说明一下。你的成员变量和局部变量同名也结果为2的原因;
因为你的局部变量和成员变量同名,导致虚拟机无法识别y=y到底是给第一个这两个yy到底是在给成员变量赋值还是给局部变量赋值
这个时候虚拟机就会选择为局部变量赋值;
如果 你把int y;改成int z;  下面改成z=y; 再返回this.x+this.z;的话就可以成功;

*/
public class GetXY
{
int x;
    //int y;
int z;
public int sum(int x,int y)
{
     this.x=x;
     y=y;//   没用this.y=y;
     //z=y;如果没有同名,看能不能赋值呢;
     y=z;
     //return x+y;
     //return this.x+this.y;
     //return this.x+y;
     //return this.y;//0. 证明 成员变量没有被赋过值;
     //return this.x+this.z;//6 说明z被成功赋值;
     return y;//0 说明当y=z;时就会把z的值赋给y,
     //这就不难理解y=y;虚拟机怎么给成员变量赋。因为它分不清楚嘛。谁给谁赋值嘛
     ;
}
  public static void main(String [] args){
        GetXY  get=new GetXY();
        System.out.println(get.sum(2,4));
}
}

点评

确实如此,讲的很详细,谢谢呀!  发表于 2012-6-19 18:37

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
this:看上去是区分局部变量和成员变量同名情况
this代表本类的对象,具体的说,代表的是它所在函数所属对象的引用,哪个对象调用this所在函数,this就代表哪个对象。
y=y;就是y。。。但不是成员变量的y。。
return this.x+this.y;其中this.y没有初始化。就是等于0;
return this.x+y; y就是传过来的值4;
回复 使用道具 举报
胡大强 发表于 2012-6-19 19:00
this:看上去是区分局部变量和成员变量同名情况
this代表本类的对象,具体的说,代表的是它所在函数所属对 ...

嗯,谢谢啦,明白了:lol
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马