static {
        System.out.println("static block");
    }
    {        
     System.out.println("initializer block : " + message);
    }那双括号是什么意思啊?

解决方案 »

  1.   

    应该是成员初始化问题,初始化是按照源代码在程序的顺序来的,语句块先初始化,但是成员message并未初始化,此时你却在语句块中引用了message。
      

  2.   

    1、不加this,jvm编译器由上往下编译,代码块在使用message之前,没有找到message定义,所以报错。
    2、加this,告诉jvm编译器,这message是当前类的属性字段,所以不会报错。
      

  3.   

    楼上说的是  问题的 关键,你把message定义在 错误地方的前面就不存在问题了。。
      

  4.   

    static{ }:叫静态构造代码块   首先初始化
    { } 叫构造代码块或者叫非static初始化块  他的 初始化执行顺序与成员函数的执行顺序是按照先后关系来的也就是说 此例子初始化先执行 1:
    static {
            println("static block");
        }再执行 2:
    {       
            println("initializer block : " + message);
        }最后执行 3:
    private String message;如果楼主把2的this去掉编译器无法识别message变量 所以报错最好的就是把2 3 顺序交换 
    其次对于    对于 '非静态'的普通方法,访问'非静态'变量的时候   可以不用加this关键字
    比如说
    public StaticBlock(String message) {
            this.message = message;
        }
    把this去掉也是可以的 但是此处若是去掉this编译器会认为你把行参变量的值自己复制给自己(形参名和成员数据名字相同了) 就达不到你自己的要求了~
      

  5.   

    很明显的,程序顺序执行,先静态块和静态变量,按从上到下,然后是构造块,非静态成员变量,从上到下。
    就好像方法里面写个
    i=0;
    int i;这样肯定是报错的啊