黑马程序员技术交流社区

标题: 关于【子类对象的初始化过程】 [打印本页]

作者: Quasimodo    时间: 2014-10-12 03:52
标题: 关于【子类对象的初始化过程】
在回答一个问题的时候,又有想不明白的地方。问题在代码的第32行,为什么不进入super()。
还有,其实这里面有些是我自己乱想的,也不知道对不对。想请大家帮忙看看。注释中的数字标语是我认为的执行顺序。谢谢~

  1. class Father
  2. {
  3.         private int i = 2 ;    //4.这就是父类中的普通成员,此时i=2(显示初始化)。
  4.                  
  5.                 {
  6.                          System.out.println("1.父类中代码块...i="+i);  //5.为了验证上一步,我们在这里加个代码块。i应该=2
  7.                 }

  8.         public Father()       //6.接着执行父类的构造方法,也就是这里
  9.         {
  10.                 this.fun();   //7.里面有个this,指的是对象,也就是Son.
  11.                                  System.out.println("3.父类构造函数...i="+i);//9.再回到这一条语句。执行结束后该轮到子类的普通成员和代码块了i应该=2
  12.                 }

  13.         public void fun()
  14.         {
  15.                 System.out.println(i);
  16.         }
  17. }

  18. class Son extends Father      
  19. {               
  20.                
  21.                 private int i = 4;            //10.跳这里来,开始初始化子类中的成员变量和构造代码块。这里i=4了(显示初始化)         
  22.            {
  23.                System.out.println("4.子类构造代码块...i="+i);//11.这条是用来验证上一个说法的,i应该=4
  24.                   
  25.           
  26.            }
  27.         public Son()        //12.最后面才执行到这哥们..太悲催了
  28.         {
  29.                         super();   //13.  按理说应该轮到这哥们吧,可是竟然不是。想了半天不知道为什么。请各位大神说下,谢谢!
  30.             i = 6;
  31.                         System.out.println("5子类构造方法...i="+i);//14.最后应该是执行这个.i应该=6
  32.         }
  33.         public  void fun()                  
  34.         {
  35.                 System.out.println("2.子类fun方法...i="+i); //8.接着到fun()方法。i会在本类中查找,当然这里肯定就是i=0了。执行完了再跳回去
  36.                                
  37.         }
  38. }

  39. class ExtendsTest
  40. {
  41.         public static void main(String[] args)
  42.         {
  43.                 Son s = new Son();     //1.new一个子类对象。
  44.                                                                                 /*
  45.                                                                                    2.首先马上要初始化父类中的静态成员和代码块,然后是初始化子类中的静态成员和代码块。
  46.                                                                                      这个程序都没有。但是因为加载了两个类,所以应该先建立了子父类中的特有属性。并默认初始化
  47.                                                                                          父类中的i加了私有,所以子类要自己建立一个i。两个i都初始化变成0.
  48.                                                                                 */
  49.                                                                                 //3.紧接着要初始化父类的普通成员变量和代码块,再执行父类的构造方法;
  50.                                                                                
  51.                 }
  52. }
复制代码




作者: Quasimodo    时间: 2014-10-12 03:53
这样排版好难看...请大家复制到EditPlus看吧。谢谢
作者: HM2014nuli    时间: 2014-10-12 07:31
本帖最后由 HM2014nuli 于 2014-10-12 07:36 编辑

楼主你好,结果没问题啊,1,先是执行了父类中代码块打印了本类的i=2,
2,接着是父类的构造函数对本类进行初始化(由于调用到了fun()方法,这个自然是0因为子类还对i没进行初始化)(再进行打印了父类的i是2),
3,再接着是子类的代码块(打印的是子类的i=4(到这时super()这一句就全部执行完了,继续执行赋值动作i=6)
接着是执行被子类复写后的fun方法,打印的是6)

执行顺序:
静态代码块->主函数->构造代码块->构造方法

作者: Quasimodo    时间: 2014-10-12 11:16
HM2014nuli 发表于 2014-10-12 07:31
楼主你好,结果没问题啊,1,先是执行了父类中代码块打印了本类的i=2,
2,接着是父类的构造函数对本类进行 ...

哦 哦  是第二点我想错了,跑死胡同里面去了...多谢了!
作者: rel4x    时间: 2014-10-12 12:42
学习了。。。。。。
作者: 面具猴    时间: 2014-10-12 13:06
代码有点乱,注释这麽长,在代码上面单行注释吧。。
作者: 18643448863    时间: 2014-10-12 15:59
你问的super()已经执行完了。为什么执行完了呢。过程你可以参考个贴,再回来想你的贴就明白了。http://bbs.itheima.com/thread-146957-1-1.html
还可以看这个贴的三楼http://bbs.itheima.com/forum.php ... p;page=1#pid1016462
作者: Quasimodo    时间: 2014-10-12 21:16
18643448863 发表于 2014-10-12 15:59
你问的super()已经执行完了。为什么执行完了呢。过程你可以参考个贴,再回来想你的贴就明白了。http://bbs. ...

一个人看视频,结果断章取义想偏了,现在已经明白了。谢谢~




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