初始化块和静态初始化块的区别?
先看代码:
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的初始化块
------解决方案--------------------