如下:
一种带有static
static{
    //代码内容
    //........
    //代码结束
}

还有就是花括号前面啥也没有的。
{
    //代码内容
    //........
    //代码结束
}

static{
  //代码内容
  //........
  //代码结束
}
静态代码域,在类的加载的时候调用一次,整个生命周期只会调用一次。
{
  //代码内容
  //........
  //代码结束
}
普通代码域,在类的每个对象创建的时候调用。

代码域中定义的变量都是局部的,只有域中的代码可以调用。

或者也称为 “静态代码块”和“非静态代码块”


static{}静态代码块,在类第一次被调用或实例化的时候就会被执行。 
静态代码块只会执行一次,一般会用来初始化一些值,并且在所有对象中全局共享。
{}非静态代码块,非静态代码块是在创建对象时自动执行的代码,不创建对象不执行该类的非静态代码块。 

在网上搜了下,有人举了个这样的例子进行说明,感觉非常到位:

举个例子:

public class TestStaticCon {   

         public static int a = 0;   
       
         static {   
             a = 10;   
             System.out.println("父类的非静态代码块在执行a=" + a);   
         }   
            
         {   
             a = 8;   
             System.out.println("父类的非静态代码块在执行a=" + a);   
         }   
       
         public TestStaticCon() {   
             this("a在父类带参构造方法中的值:" + TestStaticCon.a); // 调用另外一个构造方法   
             System.out.println(a);   
             System.out.println("父类无参构造方法在执行a=" + a);   
         }   
       
         public TestStaticCon(String n) {   
             System.out.println(n);   
             System.out.println(a);   
       
         }   
       
         public static void main(String[] args) {   
             TestStaticCon tsc = null;   
             System.out.println("!!!!!!!!!!!!!!!!!!!!!");   
             tsc = new TestStaticCon();   
         }/*Output:  
                父类的非静态代码块在执行a=10  
                !!!!!!!!!!!!!!!!!!!!!  
                父类的非静态代码块在执行a=8  
                a在父类带参构造方法中的值:10  
                8  
                8  
                父类无参构造方法在执行a=8  
                */  
       
     }  

 public class TestStaticCon {   

         public static int a = 0;   
       
         static {   
             a = 10;   
             System.out.println("父类的非静态代码块在执行a=" + a);   
         }   
            
         {   
             a = 8;   
             System.out.println("父类的非静态代码块在执行a=" + a);   
         }   
       
         public TestStaticCon() {   
             this("a在父类带参构造方法中的值:" + TestStaticCon.a); // 调用另外一个构造方法   
             System.out.println(a);   
             System.out.println("父类无参构造方法在执行a=" + a);   
         }   
       
         public TestStaticCon(String n) {   
             System.out.println(n);   
             System.out.println(a);   
       
         }   
       
         public static void main(String[] args) {   
             TestStaticCon tsc = null;   
             System.out.println("!!!!!!!!!!!!!!!!!!!!!");   
             tsc = new TestStaticCon();   
         }/*Output:  
                父类的非静态代码块在执行a=10  
                !!!!!!!!!!!!!!!!!!!!!  
                父类的非静态代码块在执行a=8  
                a在父类带参构造方法中的值:10  
                8  
                8  
                父类无参构造方法在执行a=8  
                */  
       
     }

 

这里代码块{} 插入代码的理解的要点,在于两点:

 1. static {} 这种代码块在类被引用的时候就会被调用并执行a=10,无论创建对象与否。

 2. {...} 代码块在创建对象时,进入构造函数开始执行第一条语句之前调用该代码块并执行修改a=8。


 无论是哪种代码块方式, 都会对全局变量进行修改!!!!