(转)Java初始化顺序

1在new B一个实例时首先要进行类的装载。(类只有在使用New调用创建的时候才会被java类装载器装入)
2,在装载类时,先装载父类A,再装载子类B
3,装载父类A后,完成静态动作(包括静态代码和变量,它们的级别是相同的,安装代码中出现的顺序初始化)
4,装载子类B后,完成静态动作
类装载完成,开始进行实例化
1,在实例化子类B时,先要实例化父类A
2,实例化父类A时,先成员实例化(非静态代码)
3,父类A的构造方法
4,子类B的成员实例化(非静态代码)
5,子类B的构造方法

先初始化父类的静态代码--->初始化子类的静态代码-->初始化父类的非静态代码--->初始化父类构造函数--->初始化子类非静态代码--->初始化子类构造函数

测试代码: 

Java代码  
  1. abstract class base  
  2. {            
  3.     public int age=getNumber(100);           
  4.     static{            
  5.         System.out.println("base static block");          
  6.     }  
  7.           
  8.     {             
  9.         System.out.println("base nonstatic block");           
  10.     }      
  11.     static int sage=getNumber(50);      
  12.     base(){          
  13.         System.out.println(age);          
  14.         System.out.println("base start");  
  15.         draw();//会调用子类覆盖后的方法,这儿是0!         
  16.         System.out.println("base end");              
  17.     }      
  18.     static int getNumber(int base){          
  19.         System.out.println("base.getNumber int"+base);  
  20.         return base;      
  21.     }      
  22.     public  void draw(){          
  23.         System.out.println("base.draw");      
  24.         }  
  25. }  
  26.   
  27. public class initializeOrder extends base{      
  28.     public int age=getNumber(1001);      
  29.     private int _radius=getNumber(10);      
  30.     static int sage=getNumber(250);      
  31.     static{          
  32.         System.out.println("subclass static block");      
  33.     }      
  34.     {          
  35.         System.out.println("subclass nonstatic block");    
  36.     }  
  37.     initializeOrder(int radius){          
  38.         _radius=radius;          
  39.         System.out.println(age);   
  40.         draw();//这儿是1000  
  41.         System.out.println("initializeOrder initialized");      
  42.     }      
  43.     public void draw(){  
  44.         System.out.println("initializeOrder.draw "+_radius);      
  45.         }        
  46.     public static void main(String[] args) {        // TODO Auto-generated method stub         
  47.         new initializeOrder(1000);      
  48.   
  49.     }  
  50.   
  51. }  

输出为:

Java代码  
  1. base static block  
  2. base.getNumber int50  
  3. base.getNumber int250  
  4. subclass static block  
  5. base.getNumber int100  
  6. base nonstatic block  
  7. 100  
  8. base start  
  9. initializeOrder.draw 0  
  10. base end  
  11. base.getNumber int1001  
  12. base.getNumber int10  
  13. subclass nonstatic block  
  14. 1001  
  15. initializeOrder.draw 1000  
  16. initializeOrder initialized 
原文地址:https://www.cnblogs.com/zhengwenwei/p/2044491.html