黑马程序员技术交流社区

标题: 求大牛解释下面代码的运行过程 [打印本页]

作者: showdy    时间: 2015-4-13 22:19
标题: 求大牛解释下面代码的运行过程
  1. public class ExA
  2. {  
  3.     static ExA a = new ExA();
  4.     static
  5.         {  
  6.         System.out.println("父类--静态代码块A");
  7.     }  
  8.         Y b = new Y();
  9.         public ExA()
  10.         {  
  11.         System.out.println("父类--构造函数B");
  12.     }  
  13.         {  
  14.         System.out.println("父类--非静态代码块C");
  15.     }  
  16.         public static void main(String[] args)
  17.         {  
  18.                 System.out.println("父类--静态代码块S");
  19.          new ExB();
  20.     }  
  21. }  
  22. class Y
  23. {
  24.         Y()
  25.         {
  26.                 System.out.println("Y类无参");       
  27.         }
  28. }
  29. class ExB extends ExA   
  30. {  
  31.         private static ExB b = new ExB();
  32.     static
  33.         {  
  34.         System.out.println("子类--静态代码块D");
  35.                
  36.     }  
  37.        
  38.     {  
  39.         System.out.println("子类--非静态代码块E");
  40.     }       
  41.        
  42.   
  43.     public ExB()
  44.         {
  45.         System.out.println("子类--构造函数F");
  46.     }  
  47.         Y y = new Y();
  48. }
复制代码

作者: 耳东君    时间: 2015-4-13 23:30
  1. public class ExA
  2. {  
  3.     static ExA a = new ExA();
  4.     static {  
  5.         System.out.println("父类--静态代码块A");
  6.     }  
  7.     Y b = new Y();
  8.     public ExA() {  
  9.         System.out.println("父类--构造函数B");
  10.     }  
  11.     {  
  12.                 System.out.println("父类--非静态代码块C");
  13.     }  
  14.     public static void main(String[] args) {  
  15.                 System.out.println("父类--静态代码块S");
  16.         new ExB();
  17.     }  
  18. }  
  19. class Y{
  20.         Y(){
  21.                 System.out.println("Y类无参");        
  22.         }
  23. }
  24. class ExB extends ExA   
  25. {  
  26.     private static ExB b = new ExB();
  27.     static{  
  28.         System.out.println("子类--静态代码块D");           
  29.     }  
  30.         
  31.     {  
  32.         System.out.println("子类--非静态代码块E");
  33.     }        
  34.     public ExB(){
  35.         System.out.println("子类--构造函数F");
  36.     }  
  37.         Y y = new Y();
  38. }
  39. /*1.加载 class ExA:ExA里的静态static ExA a = new ExA()变量和静态代码块进方法区。
  40.   2.执行静态static ExA a = new ExA()变量,找到ExA的空参构造函数给变量Y b = new Y()初始化,打印"Y类无参"。
  41.   3.Y b = new Y()初始化完后 打印构造代码块中的 "父类--非静态代码块C"
  42.   4.打印ExA()空构造函数的"父类--构造函数B" static ExA a = new ExA();初始化完毕。
  43.   5.执行ExA类中的静态代码块"父类--静态代码块A",此时class ExA中的静态static ExA a = new ExA()变量和
  44.   静态代码块执行完毕。
  45.   6.执行主函数下的打印语句"父类--静态代码块S"。


  46.   7.new ExB();加载class ExB,ExB里的静态private static ExB b = new ExB()变量和静态代码块进方法区。
  47.   8.执行静态private static ExB b = new ExB()变量,找到ExB的空参数构造函,通过里面的super调用了父类的
  48.   无参构造函数又执行了变量Y b = new Y(); 打印"Y类无参"。
  49.   9.打印构造代码块"父类--非静态代码块C"
  50.   10.打印构造函数"父类--构造函数B"
  51.   11.super调用完父类的无参构造后执行ExB的构造代码块打印"子类--非静态代码块E".
  52.   12.再执行成员变量Y y = new Y();打印"Y类无参"
  53.   13.打印"子类--构造函数F"
  54.   14.此时执行完private static ExB b = new ExB();
  55.   15.执行ExB中的静态代码块"子类--静态代码块D"
  56.   16.现在ExB中的静态private static ExB b = new ExB()变量和静态代码块执行完毕


  57.   17.继续完成主函数new ExB()未完成的动作找到ExB()无参构造函数,通过super到父类的ExA无参构造函数
  58.   18.又执行了Y b = new Y(); 打印了"Y类无参"
  59.   19.打印"父类--非静态代码块C"
  60.   20.打印"父类--构造函数B"
  61.   21.回到子类 打印ExB的构造代码块"子类--非静态代码块E"
  62.   22.执行成员变量Y y = new Y();打印"Y类无参"
  63.   23.打印ExB构造函数的"子类--构造函数F"
  64.   
  65.   
  66.   为什么在主函数new ExB()的过程中先执行了ExB的构造代码块后再执行成员变量Y y = new Y()?
  67.   通过下面代码体现:
  68.   class Fu{
  69.         //Y y = new Y();
  70.         {
  71.                 System.out.println("fu");
  72.         }
  73.         //Y y = new Y();
  74.         public Fu(){

  75.         }
  76.         //Y y = new Y();
  77.         public static void main(String[] args) {
  78.                 Zi z = new Zi(1);
  79.         }
  80. }

  81. class Zi extends Fu {
  82.         public Zi(int i){
  83.         System.out.println("zi"+i);}
  84. }


  85. class Y {
  86.    Y(){
  87.         System.out.println("11111");
  88.    }
  89. }
  90. */
复制代码

作者: showdy    时间: 2015-4-13 23:31
楼上大神啊。。。。。{:3_53:}




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2