我接下来把int i=20给注释掉了
结果编译器说找不到变量i
那我在static块里定义的i变量到哪里去了?不明白

解决方案 »

  1.   

    public class Q8 

    int i = 20;  static { 
    int i = 10;
    System.out.println(i) ;
    } ;  public static void main(String[] args) { 
    Q8 a = new Q8(); 
    System.out.println(a.i); 

    } 结果先输出10,然后输出20,有点类似于构造函数.
      

  2.   

    public class Q8 

    int i = 20;  void x() { 
    int i = 10;
    System.out.println(i) ;
    } ;  public static void main(String[] args) { 
    Q8 a = new Q8(); 
    System.out.println(a.i); 
    a.x() ;

    } 结果先输出20,然后输出10,类的变量在它的函数中可以重复定义
      

  3.   

    public class Q8 

    int i = 20;  public void x() { 
    int i = 10;
    System.out.println(i) ;
    } ;  public static void main(String[] args) { 
    Q8 a = new Q8(); 
    a.x() ;
    System.out.println(a.i); 

    } 结果先输出10,然后输出20,函数定义的变量在没有改变类定义的变量
      

  4.   

    static 

      int i = 10; 

    是java的静态初始化器,当类Q8;加载入内存时,系统自动调用静态初始化器
    把类静态域初始化。
    static 

      int i = 10; 
    } 与Q8的成员i已经不在同一范围之内,所以编译的时候不会报错。Q8类装载的时候先初始化i为10,如果不建新一个Q8类实例,i为10;如果建新一个Q8类实例i变为20。
      

  5.   

    楼上的大哥,我把代码改了一下:
    public class Q8
     {
     //int i = j;
     static
     {
     int i = 10;
     //int i=30;
     }
     public static void main(String[] args)
     { System.out.println(Q8.i);
     }
     }
    编译出错"q8.java": Error #: 300 : variable i not found in class test.Q8 at line 14, column 24
    如果按你说的,i应该是Q8的静态成员变量,那为什么编译器会说找不到变量i呢?那个在static块里定义的i究竟放到哪里去了呢?
      

  6.   

    我觉得此处static块只是类似一个函数的作用,所以定义的变量i对于类Q8而言是不可见的.
      

  7.   

    学习!
    只能这样了。
    static int i = 20; 
    static 

      i = 10; 

      

  8.   

    static BLOCK在类的实例初始化的时候会执行,然后在该实例的生命周期内保持。
    所以以上的现象没有什么奇怪的啊。
      

  9.   

    public class Q8
    {
     int i = 20;
     
     static
     {
      int i = 10;
      System.out.println(i);
     } public static void main(String[] args)
     {
      Q8 a = new Q8();
      System.out.println(a.i);
     }
    }等同于如下:public class Q8
    {
     int i = 20; public static void main(String[] args)
     {
     {
      int i = 10;
      System.out.println(i);
      }
      Q8 a = new Q8();
    System.out.println(a.i);
     }
    }
    也就是说static块与static main方法类似,如果没有main方法,也可以被执行,对吧,这个问题在核心技术I中有提到,static块中的语句会被执行。然后,你把static移到main方法中,因为他是块,也就是说这里的i是被定义在块里,所以当然不会有冲突了。
      

  10.   

    如果你把static块的位置移到main方法的后面,会发现也是先输出10,对吧?
    原理就是static块在实例被初始化时会先被执行。这一点楼上的弟兄们都提到了。
      

  11.   

    你再看这段代码:public class Q8
    {
     int i = 20;
    /*
     public static void main(String[] args)
     {
      Q8 a = new Q8();
    System.out.println(a.i);
     }
     */
     static {
      Q8 a = new Q8();
    System.out.println(a.i);  int i = 10;
      System.out.println(i);
      } 
    }虽然会抛出一个违例,但是可以正常输出。
    是不是对你有启发?
      

  12.   

    to zhenqingshang
    你的程序
    public class Q8
     {
     //int i = j;
     static
     {
     int i = 10;
     //int i=30;
     }
     public static void main(String[] args)
     { System.out.println(Q8.i);
     }
     }
    编译出错"q8.java": Error #: 300 : variable i not found in class test.Q8 at line 14, column 24
    根本就没有对Q8进行实例话,java的编译器再强也只是给静态变量来一个列表吧?
    没有实例话的类,根本不可能找到什么变量的吧?
      

  13.   

    mshade(毕业=?可乐) :
    我把程序改为了:public class Q8
     { static
     {
     int i = 10; }
     public static void main(String[] args)
     {
     Q8 t=new Q8();
     System.out.println(t.i);
     }
     }
    他还说找不到,这是为什么?我已经声明了类的实例了阿?
    sharetop(天生不笨) (  ) :谢谢你
    我把你的最后一个例子运行了一下,是20,10,20
    看来是先运行static block,在运行static main
    但是还有一个问题不明白,就像上面的代码,如果我只在static block里面声明i,虽然把类实例化,但还是找不到i,必须在static block外定义才行
    是不是static block内定义的变量不是该class的成员变量,所以访问不到?
      

  14.   


    我相信static块中的变量不应是这个类的成员变量,它的地位如同static main方法一样,但肯定会被先执行。