java小白试着分析了一下这个代码。求大神帮忙看一下正不正确;代码如下:

public class Test{

private static int i = 0;
private static int j = 0;

public static void main(String[] args) {


    int i = 2;//i之所以是2 而不是0  是因为 就近原则
    int k = 3;
    {
        int j = 3;
        System.out.println("i+j is\t"+i+"\t"+j);
    }

    k = i+j;
    System.out.println("k is "+k);
    System.out.println("j is "+j);//这里的j之所以是0  是因为程序里方法块的首先执行,之后
    //是静态变量最后才是 常量。
}

}

这其实就是局部变量和类的成员变量的作用域问题,不是什么就近原则问题 。首先main方法里面定义的局部变量i的作用域是整个方法,所以main 中用的都是局部变量i;其次,局部变量j是在循环操作中定义的,作用域是循环体,所以循环体外面的j用的是成员变量j。

 int i = 2;//i之所以是2 而不是0  是因为 就近原则
这个不存在什么就近。这个是定义变量,赋初值。如果这都不就着这个i而是另找一个的话,那么编译器应该报变量重复定义错误了。

System.out.println("j is "+j);//这里的j之所以是0  是因为程序里方法块的首先执行,之后
这个也不是就近,而是压根就不可能访问到你代码块的j
{
int xxx;
}
xxx = 1; //编译器错误

就近原则说的是访问变量的时候,如果两个变量都是可以访问到(这是前提),取作用域最近的。

变量的作用域问题,可不是就近原则

块限制的作用域 {}
方法的作用域 {}
类的作用域 {}

其他语言比如python对一个变量的访问是 LGB原则,局部-全局-内置

在java中就是 BMC block ,method,class

程序里方法块,那是限制了一个block的作用域,所以block中的东西只在block内部有效
如果你在block内部打印这个j的话,它肯定是block内部的作用域的值
出了block,这个变量的值就失效了

总之访问变量注意它当前在哪个 {}就可以了,你用{}理解就近原则也能行的通