Int实例变量在方法调用后不递增

时间:2013-08-20 20:08:38

标签: java

任何人都可以告诉我为什么输出是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;
    }
}

8 个答案:

答案 0 :(得分:8)

void incr(int squares) {
      squares += 10; 
  }
参数名称中的

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

如果你想操作实例变量(incr(...)是实例方法),请使用this.squares

答案 1 :(得分:5)

您已预先递增squares

incr(++squares);

所以82传递给incr。但是incr在其局部变量squares中收到值82的副本。该副本已修改,但原始版本未修改。在incr中,名称squares引用局部变量,而不是实例变量。因此,回到gosquares仍为82。

要获得92,您只需将squares参数重命名为任何其他合法标识符(例如_squaressquare或{{ 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)

由于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;
 }

答案 6 :(得分:0)

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

答案 7 :(得分:0)

局部变量正方形隐藏了类变量

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

你应该使用

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