-2

谁能告诉我为什么输出是 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;
    }
}
4

8 回答 8

8
void incr(int squares) {
      squares += 10; 
  }

squares这里的参数名称将隐藏实例变量。所以,+发生在参数变量上,而不是实例变量上。

this.squares如果要对实例变量进行操作(incr(...) 是实例方法),请使用。

于 2013-08-20T20:09:57.580 回答
5

您已在此处预先增加squares

incr(++squares);

所以 82 被传递给incr. 但incr在其局部变量中接收值 82 的副本squares。该副本已修改,但原始未修改。在incr中,名称squares指的是局部变量,而不是实例变量。所以,回到gosquares仍然是 82。

要获得92,您所要做的就是将squares参数重命名为任何其他合法标识符(例如 、_squaressquare、 或foo),以便squares在方法的主体中引用实例变量,而不是参数。

(当然还有其他方法,比如写this.squares += 10;in incr,或者返回squaresinincr并将结果赋值给squaresin go。)

于 2013-08-20T20:09:59.727 回答
2

原因squares仍然是82是由于范围。一旦incr函数被调用,squares是 82,然后函数获取变量的本地副本。

它拥有的本地副本确实会增加 10,然后在函数结束时超出范围。然后控制返回到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

作为输出。

于 2013-08-20T20:14:19.497 回答
1

将变量发送到方法后,您无需修改​​该变量。你打电话:

incr(++squares);

将 81 增加 1(因此得到 82),然后将其发送到 incr 方法。然后该方法将发送的参数更新为 10,得到 92。

但是,不会返回此值,因此 print 语句会生成 82。

如果你在 incr() 方法中放一个 print 语句,你会得到 92。

于 2013-08-20T20:10:24.957 回答
0

您没有从incr方法返回您的增量值。如果您使用该方法在屏幕上打印结果,您会看到它确实是 92;

于 2013-08-20T20:13:15.850 回答
0
void go() {
     squares++;
     incr(squares);
     System.out.println(squares);
 }

递增平方得到 82,然后将其作为刷新的整数传递,它应该会出现 92。

于 2013-08-20T20:11:08.663 回答
0

由于squeresincr方法的局部变量。所以它应该是

 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;
 }
于 2013-08-20T20:12:12.487 回答
0

局部变量 squares 隐藏了类变量

void incr(int squares) {
    squares += 10;
}

你应该使用

void incr(int squares) {
    this.squares += 10;
}
于 2013-08-20T20:44:33.583 回答