任何人都可以告诉我为什么输出是82而不是92?
public class practice {
int squares = 81;
public static void main(String[] args) {
new practice().go();
}
void go() {
incr(++squares);
System.out.println(squares);
}
void incr(int squares) {
squares += 10;
}
}
答案 0 :(得分:8)
void incr(int squares) {
squares += 10;
}
参数名称中的 squares
将隐藏实例变量。所以,+
发生在参数变量上,而不是在实例变量上。
如果你想操作实例变量(incr(...)是实例方法),请使用this.squares
。
答案 1 :(得分:5)
您已预先递增squares
:
incr(++squares);
所以82传递给incr
。但是incr
在其局部变量squares
中收到值82的副本。该副本已修改,但原始版本未修改。在incr
中,名称squares
引用局部变量,而不是实例变量。因此,回到go
,squares
仍为82。
要获得92
,您只需将squares
参数重命名为任何其他合法标识符(例如_squares
或square
或{{ 1}}),以便方法体中的foo
引用实例变量,而不是参数。
(当然还有其他方式,例如在squares
中撰写this.squares += 10;
,或在incr
中返回squares
并将结果分配到incr
squares
。)
答案 2 :(得分:2)
squares
仍然是82的原因是由于范围。调用incr
函数后,squares
为82,然后函数获取变量的本地副本。
它具有的本地副本确实会增加10,然后在函数结束时超出范围。然后,Control返回go
函数,其中正方形未增加10。
然后将其打印出来。
如果你这样做了:
public class practice {
int squares = 81;
public static void main(String[] args) {
new practice().go();
}
void go() {
incr(++squares);
System.out.println(squares);
}
void incr(int squares) {
squares += 10;
System.out.println(squares);
}
}
然后你会看到
92
82
作为输出。
答案 3 :(得分:1)
将变量发送到方法后,不要修改变量。你打电话:
incr(++squares);
将81增加1(因此得到82),然后将其发送到incr方法。然后该方法更新它发送的参数10,得到92。
但是,不返回此值,因此print语句产生82。
如果在incr()方法中放置一个print语句,则会得到92。
答案 4 :(得分:0)
void go() {
squares++;
incr(squares);
System.out.println(squares);
}
增加正方形以获得82然后将其作为刷新的整数传递,它应该出现92.
答案 5 :(得分:0)
由于squeres
是incr
方法的局部变量。所以它应该是
void go() {
squares = incr(++squares);
System.out.println(squares);
}
int incr(int squares) {
return (squares += 10);
}
或
void go() {
incr(++squares);
System.out.println(squares);
}
void incr(int squares) {
this.squares = squares + 10;
}
答案 6 :(得分:0)
您没有从incr
方法返回增加的值。如果你在该方法中打印出屏幕结果,你会看到它确实是92;
答案 7 :(得分:0)
局部变量正方形隐藏了类变量
void incr(int squares) {
squares += 10;
}
你应该使用
void incr(int squares) {
this.squares += 10;
}