Java之初始化顺序讲解

2014-11-23 23:34:36 · 作者: · 浏览: 0
1、在new B一个实例时首先要进行类的装载。(类只有在使用New调用创建的时候才会被java类装载器装入)
2、在装载类时,先装载父类A,再装载子类B
3、装载父类A后,完成静态动作(包括静态代码和变量,它们的级别是相同的,安装代码中出现的顺序初始化)
4、装载子类B后,完成静态动作

类装载完成,开始进行实例化
1、在实例化子类B时,先要实例化父类A
2、实例化父类A时,先成员实例化(非静态代码)
3、父类A的构造方法
4、子类B的成员实例化(非静态代码)
5、子类B的构造方法
先初始化父类的静态代码--->初始化子类的静态代码-->初始化父类的非静态代码--->初始化父类构造函数--->初始化子类非静态代码--->初始化子类构造函数

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