1

为什么数据字段值会发生变化?我正在阅读的文字没有清楚地解释它。这一章主要是关于数据字段封装,你所做的对他们来说可能会影响代码和这类事情的小事情。

public class Questions {
    private static int j = 0;
    private static int i = 0;
    public static void main(String[] args) {
        int i = 2;
        int k = 3;
        {   
            j = 3;
            System.out.println("j is " + j);
        }
        k = i + j;
        System.out.println("k is " + k);
        System.out.println("j is " + j);
    }
}

/* output is: 
j is 3
k is 5
j is 3
*/ 
//but if you do this one thing:
public class Questions {
    private static int j = 0;
    private static int i = 0;
    public static void main(String[] args) {
        int i = 2;
        int k = 3;
        {   
            int j = 3;
            System.out.println("j is " + j);
        }
        k = i + j;
        System.out.println("k is " + k);
        System.out.println("j is " + j);
}
/* the output is: 
j is 3 
k is 2
j is 0
*/

任何输入表示赞赏!

4

3 回答 3

2

在第一个代码中:

{   
    j = 3;
    System.out.println("j is " + j);
}

您很简单地将新值分配给static在 main 之外声明的字段。即使在本地阻止之后,更改也会持续存在。

但在第二个代码中:

{   
    int j = 3;
    System.out.println("j is " + j);
} 

您正在声明一个新的块范围局部变量,它隐藏了static该块中的字段。j在此块中所做的任何更改都是在块范围的变量中完成的,而不是在静态字段中完成的。它超出了该块之外的范围。您在块外使用的变量j只不过是static字段,它与j块内的声明无关。

于 2013-07-14T21:28:12.503 回答
0

您在 {} 中声明了一个新的 j (int j)。该变量与您在类顶部声明的变量不同。

我正在编辑以添加该变量仅在 {} 内使用。一旦你离开那里,唯一的“现有” j 就是在顶部声明的那个。

于 2013-07-14T21:27:27.147 回答
0

当您在另一个范围内(块范围 - 在大括号内)声明 int j 时,您会创建一个新的j,它会在大括号结束时消失。这意味着您将在括号外引用旧的j 。因此,J 在括号内为 3,在括号外为 0。

int j = 0;

{   
   int j = 3;
   System.out.println("j is " + j); // j is 3
}

System.out.println("j is " + j);  //j is 0 out here

如果您想更改新范围内的外部j,您可以轻松地做到这一点,而不使用关键字int

int j = 0;

{   
   /*int*/ j = 3;
}

System.out.println("j is " + j); // j is 3

块作用域很容易造成混乱,创建新变量增强了代码的可读性。

于 2013-07-14T21:28:49.780 回答