Java中初始化块和静态初始化块的区别

在Java中,有两种初始化块:静态初始化块和非静态初始化块.

静态初始化块:使用static定义,当类装载到系统时执行一次.若在静态初始化块中想初始化变量,那仅能初始化类变量,即static修饰的数据成员.
非静态初始化块:在每个对象生成时都会被执行一次,可以初始化类的实例变量.

非静态初始化块会在构造函数执行时,且在构造函数主体代码执行之前被运行.

括号里的是初始化块,这里面的代码在创建java对象时执行,而且在构造器之前执行!

其实初始化块就是构造器的补充,初始化块是不能接收任何参数的,定义的一些所有对象共有的属性、方法等内容时就可以用初始化块了初始化!!

好处是可以提高初始化块的复用,提高整个应用的可维护性。--《疯狂java讲义》

 

 1  class Parent {     
 2            public static String p_StaticField = "父类--静态变量";    
 3              public String p_Field = "父类--变量";      
 4           //父类的静态初始化块 
 5          static {    
 6               System.out.println(p_StaticField);    
 7                System.out.println("父类--静态初始化块");    
 8          }      
 9         //父类的非静态初始化快   
10           {    
11              System.out.println(p_Field);    
12               System.out.println("父类--初始化块");    
13           }
14         //父类的构造函数
15          public Parent() {    
16              System.out.println("父类--构造器");    
17           }    
18      }       
19          public class SubClass extends Parent {    
20          public static String s_StaticField = "子类--静态变量"; 
21          public String s_Field = "子类--变量";    
22          // 子类的静态初始化块    
23          static {    
24               System.out.println(s_StaticField);    
25               System.out.println("子类--静态初始化块");    
26           } 
27         //子类的非静态初始化快   
28           {    
29               System.out.println(s_Field);    
30               System.out.println("子类--初始化块");    
31           } 
32          //子类的构造函数       
33          public SubClass() {    
34               System.out.println("子类--构造器");    
35           }       
36          public static void main(String[] args) { 
37             new Parent();
38               System.out.println("-------------------");
39           new SubClass(); 
40            System.out.println("-------------------");
41            new SubClass();  
42          }    
43      }                                    

 

运行结果

程序的运行结果为:
父类--静态变量
父类--静态初始化块
子类--静态变量
子类--静态初始化块
父类--变量
父类--初始化块
父类--构造器
-------------------
父类--变量
父类--初始化块
父类--构造器
子类--变量
子类--初始化块
子类--构造器
-------------------
父类--变量
父类--初始化块
父类--构造器
子类--变量
子类--初始化块
子类--构造器

 

分析:

父类--静态变量 
父类--静态初始化块 
子类--静态变量 
子类--静态初始化块 
首先java虚拟机加载这两个类,静态块(类块)执行(只执行一次),随后如果产生实例就执行变量块(实例块),再构造方法


 如果在Parent类中

public static void main(String[] args) {
Parent p;
}
执行:
结果:
父类--静态变量
父类--静态初始化块

如果在Parent类中
public static void main(String[] args) {
    new Parent();
}


父类--静态变量
父类--静态初始化块
父类--变量
父类--初始化块
父类--构造器

若果在SubClass中
public static void main(String[] args) { 
      new Parent(); 
}    
执行:
结果:因为Java虚拟机加载了两个类(main方法在子类中执行)没有产生子类
父类--静态变量
父类--静态初始化块
子类--静态变量
子类--静态初始化块
父类--变量
父类--初始化块
父类--构造器

在Subclass类中
 public static void main(String[] args) { 
      new Parent(); 
    System.out.println("-------------------"); 
      new SubClass(); 
     
    }    
执行
结果:new子类首先执行父类的实例块和父类的构造方法,然后是子类的实例块和构造方法

父类--静态变量
父类--静态初始化块
子类--静态变量
子类--静态初始化块
父类--变量
父类--初始化块
父类--构造器
-------------------
父类--变量
父类--初始化块
父类--构造器
子类--变量
子类--初始化块
子类--构造器

posted @ 2014-03-29 14:23  woshijpfgg  阅读(3490)  评论(1编辑  收藏  举报