x=2;

static int x=5;
这样写的话可以为完美运行。{
     System.out.println(x);

static int x=5;
这样却会编译报错
为什么赋值可以,输出却不行呢?

解决方案 »

  1.   

    我觉得这涉及到了变量的细节,对于描述的问题中的第一种情况:变量x先在静态语句块中被赋值,然后才被声明,这种情况java允许,但是第二中情况:变量在静态语句块中被输出,然后才被声明,这种情况则无法通过编译。java这样设计肯定是有原因的,我想知道其中的原因,希望有大神能解释一下
      

  2.   

    你发的代码块不是静态的啊,如果你那个代码块是静态的话,那static{System.out.println(x);}先加载进内存,这时static int x=5;是还没有进内存的,所以打印语句中的x还没有声明,而java中的变量是要先声明再使用,所以编译会出错。
      

  3.   

    加载要经过类加载和对象的初始化。1.类加载阶段:  会加载类,会加载类变量2.对象初始化阶段:会调用该类的初始化块和构造器进行对象的初始化。所以,我试了一下,编译通过(JDK1.8)
    package test.SWITCH;import java.io.BufferedReader;
    import java.io.InputStreamReader;/**
     * Created by liudy on 16/10/17.
     */
    public class Switch {
        {
            x = 2;
            System.out.println(x);
        }    static int x = 5;
    }
      

  4.   

    非静态代码块(就是不加static)的是优先于构造函数执行了,你再里面放了个变量x。执行的时候,x并没有值,输出当然就会出错了
      

  5.   

    你如果  不知道 顺序是怎么样的就看我博客。  理论上没问题 , static 的x在类初始化阶段就已经OK了。我也试了一下,是不是你其他代码有问题?
      

  6.   

    http://blog.csdn.net/weixin_34881029/article/details/52563618
      

  7.   

    没意外的话应该是其他代码有问题……正常来讲,都是static的加载完了才会去加载非static的有一种特殊情况,就是static ThisClass = new ThisClass()
    涉及到这样的东西,会导致static未加载完,先加载非static的东西去了,最后就会出错
      

  8.   

    不对……虽然这样会导致问题,却不会出错啊!static属性被赋值之前,先重置为0,所以即使在赋值之前调用也是有值的。