class Test{
static int i = 5;
static{   //这个static是干嘛的。 有什么用。
System.out.println("output=" + i++);
}
}public class TestStatic{
public static void main(String[] args){
System.out.println("output:i=" + Test.i);
  }
}
“static方法不能访问与他本身的参数以及static变量分离的任何变量”这句话是什么意思?

解决方案 »

  1.   

    类加载的时候 会先加载静态语句块的内容
    static修饰的语句块里不能用非static修饰的变量
      

  2.   

    这个的作用相当于你写一个默认的构造函数,只要你加载这个类,就会加载这个static静态块中的代码,放在内存中。
      

  3.   

    首先帮楼主重新排个版:class Test
    {
       static int i = 5;
       static
       {
          //这个static是干嘛的。 有什么用。
          System.out.println("output=" + i++);
       }
    }
    public class TestStatic
    {
       public static void main(String[] args)
       {
          System.out.println("output:i=" + Test.i);
       }
    }代码中标注的那个块叫做“静态初始化块”,当JVM加载该类的时候,就执行静态初始化块中的语句“static方法不能访问与他本身的参数以及static变量分离的任何变量”这句话是什么意思?因为static方法不需它所属的类的任何实例就可以被调用,因此没有this值,static方法访问非静态变量的尝试会引起编译错误
      

  4.   

    为什么在我commment out System.out.println("output:i=" + Test.i);,连static模块里面的也没有打印了?
      

  5.   

    类加载的时候 会先加载静态语句块的内容
    static修饰的语句块里不能用非static修饰的变量
      

  6.   

    static修饰的变量是静态变量也叫类变量,类变量中不能调用实例变量和实例方法,因为类变量jvm加载的,
    它调用的时候可以直接用类名.X来调用,不用this!
      

  7.   

    当程序运行的时候,JVM会首先将静态初始化块加载到内存中,static修饰的变量是静态变量也叫类变量,它的调用直接可以是类名来直接调用,静态块中访问的变量不能是非静态初始化块的,只能是静态变量或者类变量·
      

  8.   


    main方法中,当线程看到打印语句中的Test.i时,此时用到了Test类,于是JVM加载Test类,Test类的静态块中语句开始执行,然后再回到刚才的打印语句中打印出来output:i=6
    如果comment掉那个打印语句,整个程序中都没有用到Test类,JVM也就不会加载Test类了