public class a { 
    static int x;
    x = 10;
    
    public static void main(String[] args) {
        System.out.println(x);
    }
}上面的运行不对  下面是解释  
static int x;
  {x = 10;}那么是0如果写成
  static int x;
  static {x = 10;}
那么是10有人能给我解释一下吗?

解决方案 »

  1.   

    这是java块执行顺序的问题,static块在java类loader的时候就执行,而普通的块当创建对象实例时才会执行
      

  2.   

    static 是在类加载器加载类的Class文件时候会被执行,远在构造器之前执行如果是static的变量,则开始赋值 如果没有给初值,则编译器给默认的值如果是static代码执行区域,则先执行这些static 部分的执行完了,再才是分配对内存,初始化类成员属性,调用构造器实例化类static int x;
    x是类属性,会被开始直接赋值为0 ,然后在调用main这个static方法时,它值是0 所以打印出0。在这里,调用main时候,x=10这个赋值没有机会被执行的  static int x;
      static {x = 10;}这静态属性和静态代码块,都在类调用构造器之前执行,x=10  然后调用main时候 x已经为10 则打印出10
      

  3.   

    纠正下 不是常量 是变量
    补充下 静态常量是可以在 static块中初始化的 
      

  4.   

    2楼回答的很清楚,呵呵 定一下
    自己看到static定义的代码块呢
      

  5.   

    static 是修饰的字段和方法是属于类的不是属于某个对象的;
    程序的执行是先开始执行main方法的但是 如果有static静态初始化块的话则先执行的是静态块再执行main方法;public class a { 
        static int x;
        static {x = 10;}//这是个静态块所以先执行它,
        
        public static void main(String[] args) {//执行main方法时X的值已经变为10 
                System.out.println(x);//打印结果为10
        }
    }public
     class a { 
        static int x;
       {x = 10;}//程序没静态块,所以此句是没机会被执行到,
        public static void main(String[] args) {
            System.out.println(x);//打印结果为0
        }
    }