/*这个地方其实主要是看对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));
}
}
|