在回答一个问题的时候,又有想不明白的地方。问题在代码的第32行,为什么不进入super()。
还有,其实这里面有些是我自己乱想的,也不知道对不对。想请大家帮忙看看。注释中的数字标语是我认为的执行顺序。谢谢~
- class Father
- {
- private int i = 2 ; //4.这就是父类中的普通成员,此时i=2(显示初始化)。
-
- {
- System.out.println("1.父类中代码块...i="+i); //5.为了验证上一步,我们在这里加个代码块。i应该=2
- }
- public Father() //6.接着执行父类的构造方法,也就是这里
- {
- this.fun(); //7.里面有个this,指的是对象,也就是Son.
- System.out.println("3.父类构造函数...i="+i);//9.再回到这一条语句。执行结束后该轮到子类的普通成员和代码块了i应该=2
- }
- public void fun()
- {
- System.out.println(i);
- }
- }
- class Son extends Father
- {
-
- private int i = 4; //10.跳这里来,开始初始化子类中的成员变量和构造代码块。这里i=4了(显示初始化)
- {
- System.out.println("4.子类构造代码块...i="+i);//11.这条是用来验证上一个说法的,i应该=4
-
-
- }
- public Son() //12.最后面才执行到这哥们..太悲催了
- {
- super(); //13. 按理说应该轮到这哥们吧,可是竟然不是。想了半天不知道为什么。请各位大神说下,谢谢!
- i = 6;
- System.out.println("5子类构造方法...i="+i);//14.最后应该是执行这个.i应该=6
- }
- public void fun()
- {
- System.out.println("2.子类fun方法...i="+i); //8.接着到fun()方法。i会在本类中查找,当然这里肯定就是i=0了。执行完了再跳回去
-
- }
- }
- class ExtendsTest
- {
- public static void main(String[] args)
- {
- Son s = new Son(); //1.new一个子类对象。
- /*
- 2.首先马上要初始化父类中的静态成员和代码块,然后是初始化子类中的静态成员和代码块。
- 这个程序都没有。但是因为加载了两个类,所以应该先建立了子父类中的特有属性。并默认初始化
- 父类中的i加了私有,所以子类要自己建立一个i。两个i都初始化变成0.
- */
- //3.紧接着要初始化父类的普通成员变量和代码块,再执行父类的构造方法;
-
- }
- }
复制代码
|