0

在下面的示例代码中,为什么每种方法后的最终值不同。我希望两者都显示“i = 1”

public class Test {

    public int i = 0;    

    public static void main( String args[] ) {        
        Test t = new Test();
        t.test();
    }

    public void test() {

        i = 0;
        System.out.println( "[start a] i = " + i );
        doSomethingA( i++ );
        System.out.println( "[end   a] i = " + i );

        System.out.println( "---------------------" );

        i = 0;
        System.out.println( "[start b] i = " + i );
        doSomethingB( i++ );
        System.out.println( "[end   b] i = " + i );

    }

    // Direct assignment of passed value
    public void doSomethingA( int x ) {
        i = x;
    }

    // Equation of passed value
    public void doSomethingB( int x ) {
        i += x;
    }

}

结果是:

[start a] i = 0
[end   a] i = 0
---------------------
[start b] i = 0
[end   b] i = 1

为什么我在方法中对“i”做什么很重要,它不应该在方法结束后增加 1 吗?

在这两种情况下,我都在方法内将 'i' 的值分配为 0。

谢谢

4

2 回答 2

1

以下是从 调用这两种方法时发生的情况test

第一的。

i开始00打印。 i++被评估。因为它是后增量,所以表达式值是旧值0,所以这就是传递给doSomethingA. 后 增量离开i。将( ) 分配回,因此被打印。1doSomethingAx0i0

第二。

i开始00打印。 i++被评估。因为它是后增量,所以表达式值是旧值0,所以这就是传递给doSomethingB. 后 增量离开i。将( ) 添加到,因此保留,并被打印。1doSomethingBx0ii11

于 2013-10-25T18:30:48.890 回答
0

添加

System.out.println("i=" + i + ", x=" + x); 

doSomethingAdoSomethingB方法的开始,你会看到在这两种情况下

i=1, x=0

这是因为在

method(i++);

的第一个当前值i传递给方法制作x = 0,然后字段i递增(到1),然后执行方法体。所以当你在方法体内做

i = x;

你设置i0

但如果你这样做

i += x;

您正在添加0的当前值i不会1改变i.

于 2013-10-25T18:37:43.980 回答