日期:2014-05-20  浏览次数:20720 次

初始化块和静态初始化块的区别?
先看代码:
class Parent {  
  public static String p_StaticField = "父类--静态变量";  
  public String p_Field = "父类--变量";  
  // 下面这些是干什么的?解释以下,不是很明白 
  static {  
  System.out.println(p_StaticField);  
  System.out.println("父类--静态初始化块");  
  }  
  // 下面这是干什么的?不明白?为什么这么写  
  {  
  System.out.println(p_Field);  
  System.out.println("父类--初始化块");  
  }  
  public Parent() {  
  System.out.println("父类--构造器");  
  }  
}  
public class SubClass extends Parent {  
  public static String s_StaticField = "子类--静态变量"; 
  public String s_Field = "子类--变量";  
  // 静态初始化块  
  static {  
  System.out.println(s_StaticField);  
  System.out.println("子类--静态初始化块");  
  }  
  {  
  System.out.println(s_Field);  
  System.out.println("子类--初始化块");  
  }  
  public SubClass() {  
  System.out.println("子类--构造器");  
  }  
  public static void main(String[] args) { 
  new Parent();
  System.out.println("-------------------");
  new SubClass(); 
  System.out.println("-------------------");
  new SubClass();  
  }  

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



不明白为什么是这样的结果?把详细的执行过程讲下好吗?谢谢了


------解决方案--------------------
我理解的也不知道确切不

父类--静态变量 
父类--静态初始化块 
子类--静态变量 
子类--静态初始化块 
首先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子类首先执行父类的实例块和父类的构造方法,然后是子类的实例块和构造方法

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


------解决方案--------------------
1.静态初始化块只在某个类第一次装入内存时才执行,这就是为什么只有第一次new Parent()才有“静态初始化块”输出,而后面却不执行输出的原因。
2.初始化块在某个对象生成时(被new)执行。所以两次new SubClass()都执行初始化块。因为SubClass也是Parent类,所有new SubClass()时也执行Parent的初始化块
------解决方案--------------------