Java数据字段封装新问题

时间:2013-07-14 21:23:31

标签: java scope encapsulation

为什么数据字段值会发生变化?我正在阅读的文字没有明确解释。本章主要是关于数据字段封装,你做的很少的事情可能会影响代码和那种东西。

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
*/

感谢任何输入!

3 个答案:

答案 0 :(得分:2)

在第一段代码中:

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

您很容易为main外部声明的static字段分配新值。即使在本地区块之后,更改仍将持续。

但在第二段代码中:

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

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

答案 1 :(得分:0)

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

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

答案 2 :(得分: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

块范围很容易造成混淆,创建新变量可增强代码的可读性。