为什么静态变量在最终

时间:2015-10-31 01:30:19

标签: java

据我所知,如果静态变量的值在一个地方改变,那么它将反映在所有地方。例如

static int i=0;

public static void test1()
   {
       System.out.println(i);
       i=100;
   }
   public static int test2()
   {
       return i;
   }

test1()的sysout - 0 test2()的sysyout = 100; 再次测试sys1()= 0

的sysout

我很清楚这一点。

但我不清楚下面的代码

public static int test() {

    try {
        i = 2;
        System.out.println("before "+i);
        return i;
    } finally {
        i = 12;
        System.out.println("in finally");
    }
}

那么为什么它打印2即使静态的i的值改为12; 下面是方法调用的序列;

test1();
      System.out.println(test2());
      test1();
      System.out.println(test());

输出

0
100
100
before 2
in finally
2

修改

当我调试时,我发现流程为try block-> finally block-> try blocks return语句。所以在这种情况下,在控制转到return语句之前,最后执行block。所以这意味着i的值是12,那么为什么它没有返回12

4 个答案:

答案 0 :(得分:3)

这是一种正常行为,因为您打印的最后一个2只是方法test()的返回值。并且,当在finally块之前执行返回时,意味着i的值将在i的值更改之前复制到返回值中。

如果在执行方法System.out.println(i);后执行test(),则会打印12

〜费边

答案 1 :(得分:2)

您打印出test()的返回值作为您做的最后一件事,而不是i

执行return i时,会评估i。所以那时你正在有效地做return 2;。因此,由于i已经被评估为2,所以在finally块中更改它并不会影响return语句中已经评估的值。

如果你这样做

System.out.println(test());
System.out.println(i);

您会看到i是12。

有关详细信息,请参阅this

答案 2 :(得分:1)

它打印'2'因为当test()返回i时,它返回当前值i,而不是使用它时的任何值。并且,当值为“2”时,您返回i,当您打印它时,它将打印返回时的值。对于所有基本类型都是如此,例如intbooleandouble等。但是,如果返回一个Object,每当您对返回的对象进行更改时,您都将对原始对象进行更改。

答案 3 :(得分:0)

public static int test() {
    try {
        i = 2;
        System.out.println("before "+i);
    } finally {
        i = 12;
        System.out.println("in finally");
        return i;
    }
}

我上面更改了你的test()代码,因为我认为我知道这个问题。 当您调用System.out.println(test());时,您的旧代码返回值2.

这种情况正在发生,因为当我实际上等于2时,你调用了返回语句(在try块中)。它有点奇怪的java仍然执行finally块,但那就是生活!

你希望它返回12是吗?然后将return语句添加到finally块。它会给你一些可以抑制的警告但是继续。