构造方法中的this关键字

lilyly 2010-03-24 07:45:05
有些书上对于this的用法,是指内存中的当前对象。在构造方法初始化成员变量时,如果不用this指明,=号左边的变量常常也指的是成员变量(在传入参数同名的情况下)。但是试过,实际却不是这样。代码如下:

class A {
int i = 1;
public A(int i) {
i = i;
}
}

class Test {
public static void main(String args[]) {
A a = new A(2);
System.out.println(a.i);
}
}


上述代码打印出的i的值仍然为1,但如果在构造方法中,将传参代码改为 this.i = i; 其他代码不动,则打印出的i值为2。

难道 i = i 这种用法压根是错误的吗?

请明白人指教!谢谢!
...全文
529 41 打赏 收藏 转发到动态 举报
写回复
用AI写文章
41 条回复
切换为时间正序
请发表友善的回复…
发表回复
lilyly 2010-03-24
  • 打赏
  • 举报
回复
[Quote=引用 32 楼 keeya0416 的回复:]
看你的例子好像是这么一回事,我用我这机子试的结果和你一样
不过我印象中好像那个理论是对的,我也做过实验的;
具体的忘了
莫非JDK版本,或者Eclipse版本有影响?
回头我再查查去
呵呵 细节决定成败
楼主加油
[/Quote]

为了排除JDK版本问题,我分别 在1.4和1.6版本上做过,结果一样。

谢谢全程相助,非常感谢!赶时间,晚上回来结帖!!
再次感谢!
keeya0416 2010-03-24
  • 打赏
  • 举报
回复
我现在已经转战c#阵营了
呵呵 Java 都忘得差不多了
不过使用对Java有那么一股莫名的好感
莫非这就是所谓的初恋
呵呵
keeya0416 2010-03-24
  • 打赏
  • 举报
回复
看你的例子好像是这么一回事,我用我这机子试的结果和你一样
不过我印象中好像那个理论是对的,我也做过实验的;
具体的忘了
莫非JDK版本,或者Eclipse版本有影响?
回头我再查查去
呵呵 细节决定成败
楼主加油
lilyly 2010-03-24
  • 打赏
  • 举报
回复
[Quote=引用 29 楼 keeya0416 的回复:]
引用 27 楼 lilyly 的回复:
在return之前打印

在return前打印的话就是打印的参数,你area方法中的 y = y;左边的那个也是参数。
说到底还是没有引用到对象的 y
但你两个例子没有什么冲突的呀
[/Quote]

啊,我明白了,是没有冲突,在这个方法中,并没有用到成员变量,可以认为 它就是局部 变量,y=y,其实没有做什么操作,是这样的吧? 只是在方法中直接用了y,没有用this.y,如果要是用的this.y,则仍然是0.我明白了,那么,是不是意味着,““当构造方法的参数名与数据成员名相同时,将赋值号左边的标识符默认为对象的数据成员名””这个理论,根本不对?
keeya0416 2010-03-24
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 lilyly 的回复:]

啊,确实,那么在方法的计算过程中,怎么没有把y直接传0?还有,我在area方法中,又试了一下打印y的值,这时候却不是0了,这是怎么回事?

[/Quote]
你的area方法内部的y都是你的那个参数y,在方法内部因为没有用this,你对象的y被屏蔽了。它始终是0.0
keeya0416 2010-03-24
  • 打赏
  • 举报
回复
[Quote=引用 27 楼 lilyly 的回复:]
在return之前打印
[/Quote]
在return前打印的话就是打印的参数,你area方法中的 y = y;左边的那个也是参数。
说到底还是没有引用到对象的 y
但你两个例子没有什么冲突的呀
keeya0416 2010-03-24
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 lilyly 的回复:]
正是,这个程序中的y=y,跟第一个道理一样,但是在main方法中,确实 把真正的形参传进去了,而第一个程序就不行
[/Quote]
细说下,我没弄懂你的意思
lilyly 2010-03-24
  • 打赏
  • 举报
回复
在return之前打印
lilyly 2010-03-24
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 keeya0416 的回复:]
Java code

class classArea {
double x, y;

double area(double x, double y) {
double s;
this.x = x;
y = y;
s = this.x * y;
return s;
}
}
……
[/Quote]

啊,确实,那么在方法的计算过程中,怎么没有把y直接传0?还有,我在area方法中,又试了一下打印y的值,这时候却不是0了,这是怎么回事?
keeya0416 2010-03-24
  • 打赏
  • 举报
回复

class classArea {
double x, y;

double area(double x, double y) {
double s;
this.x = x;
y = y;
s = this.x * y;
return s;
}
}

public class c5_11 extends classArea {
public static void main(String[] args) {
double a = 2.2, b = 3.1, z;
c5_11 ss = new c5_11();
z = ss.area(a, b);
System.out.println("z=" + z);
System.out.println("x=" + ss.x);
System.out.println("y=" + ss.y);
}
}

测试结果:
z=6.820000000000001
x=2.2
y=0.0
lilyly 2010-03-24
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 keeya0416 的回复:]
引用 18 楼 lilyly 的回复:
引用 16 楼 keeya0416 的回复:
不过LZ说的问题我过去还真没注意过,平时为了代码规范都是加的this,
我也记得书上是说默认是this的,奇怪了
后头再翻翻去


是的,我知道this的用法规范,只是遇上这么个问题,还真不知道到底是什么原因,而且百度的时候确实是有理论支持,在=号左面指的是成员变量,而实际操作却不是这么回事,只是想……
[/Quote]



正是,这个程序中的y=y,跟第一个道理一样,但是在main方法中,确实 把真正的形参传进去了,而第一个程序就不行
keeya0416 2010-03-24
  • 打赏
  • 举报
回复

class classArea {
double x, y;

double area(double x, double y) {
double s;
this.x = x;
y = y;
s = this.x * y;
return s;
}
}

public class c5_11 extends classArea {
public static void main(String[] args) {
double a = 2.2, b = 3.1, z;
c5_11 ss = new c5_11();
z = ss.area(a, b);
System.out.println("z=" + z);
System.out.println("y=" + ss.y);
}
}

测试结果:
y= 0.0 的
lilyly 2010-03-24
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 qqcrazyboy 的回复:]
Java code
class A {
int i = 1;
public A(int i) {
this.i = i; //将A方法里的i的值赋给成员变量i
}
}

class Test {
public static void main(String args[]) {
A a = new A(2);//2则赋给了a对象的成员变量i
System.out.println……
[/Quote]


我知道这个原理,请看我后面跟的补充和大家的跟帖,谢谢帮忙!
keeya0416 2010-03-24
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 lilyly 的回复:]
引用 16 楼 keeya0416 的回复:
不过LZ说的问题我过去还真没注意过,平时为了代码规范都是加的this,
我也记得书上是说默认是this的,奇怪了
后头再翻翻去


是的,我知道this的用法规范,只是遇上这么个问题,还真不知道到底是什么原因,而且百度的时候确实是有理论支持,在=号左面指的是成员变量,而实际操作却不是这么回事,只是想弄清楚。若说这个理论错了,后面的程序却又说……
[/Quote]
你后面的那个程序怎么说不通呢,你那里用的还是参数的那个y,你对象ss 的y根本就没变的呀。
lilyly 2010-03-24
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 keeya0416 的回复:]
引用 14 楼 lilyly 的回复:
引用 13 楼 keeya0416 的回复:
引用 4 楼 lilyly 的回复:
补充:那么类似的操作,下面的代码怎么能没问题?

class classArea {
double x,y;

double area(double x,double y) {
double s;
this.x=x;
y=y;
s=this.x*y;
……
[/Quote]

不,y值确实不是0,确实是传进去的值,所以矛盾了,请试一下,如果有时间
智鹿软件 2010-03-24
  • 打赏
  • 举报
回复
class A {
int i = 1;
public A(int i) {
this.i = i; //将A方法里的i的值赋给成员变量i
}
}

class Test {
public static void main(String args[]) {
A a = new A(2);//2则赋给了a对象的成员变量i
System.out.println(a.i);
}
}
lilyly 2010-03-24
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 keeya0416 的回复:]
不过LZ说的问题我过去还真没注意过,平时为了代码规范都是加的this,
我也记得书上是说默认是this的,奇怪了
后头再翻翻去
[/Quote]

是的,我知道this的用法规范,只是遇上这么个问题,还真不知道到底是什么原因,而且百度的时候确实是有理论支持,在=号左面指的是成员变量,而实际操作却不是这么回事,只是想弄清楚。若说这个理论错了,后面的程序却又说不通……犯晕了
keeya0416 2010-03-24
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 lilyly 的回复:]
引用 13 楼 keeya0416 的回复:
引用 4 楼 lilyly 的回复:
补充:那么类似的操作,下面的代码怎么能没问题?

class classArea {
double x,y;

double area(double x,double y) {
double s;
this.x=x;
y=y;
s=this.x*y;
return s;
}
}

c……
[/Quote]
你调用这个方法后你的 x 的值变了,但你的 y 值还是0.0的
keeya0416 2010-03-24
  • 打赏
  • 举报
回复
不过LZ说的问题我过去还真没注意过,平时为了代码规范都是加的this,
我也记得书上是说默认是this的,奇怪了
后头再翻翻去
lilyly 2010-03-24
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 arthur0088 的回复:]
最好是this.i=i这样写
还有就是最好将i的访问权限定位private,然后写好getter/setter,通过对象.getter
[/Quote]


这个我知道,我就是简单地一写,方便后面调用,目的不是这块
加载更多回复(21)

62,616

社区成员

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

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