黑马程序员技术交流社区

标题: 继承中的初始化问题 [打印本页]

作者: joeywr    时间: 2015-8-22 11:34
标题: 继承中的初始化问题
package chapter7;

public class TestExtendsAndStatic {

        /**
         * @param args
         */
        public static void main(String[] args) {
                // TODO Auto-generated method stub
                EC ec=new EC(2);
        }

}

class EA{
        EA(){
                System.out.println("EA");
        }
       
        EA(int i){
                System.out.println("EA "+i);
        }
}

class EB{
        EB(){
                System.out.println("EB");
        }
}

class EC extends EB{
        EA ea=new EA(1);
        static EA eaS=new EA(2);
       
        EC(){
                System.out.println("EC");
        }
       
        EC(int i){
                System.out.println("EC "+i);
        }
}
首先初始化static成员 输出 EA 2
然后是成员 ea 输出EA 1
然后在EC的构造器中调用基类EB的构造器输出 EB
最后执行EC的构造器输出 EC 2

但是结果是
EA 2
EB
EA 1
EC 2

第二行和第三行顺序颠倒了  我不知道该怎么理解了……
作者: vipsong    时间: 2015-8-22 13:06
本帖最后由 vipsong 于 2015-8-22 13:11 编辑

可以参见
  1. 传智播客_2015年Java基础班视频精华版\day08\avi\08.21_面向对象(继承中的面试题3).avi
复制代码

  1. A:成员变量的问题

  2. int x = 10; //成员变量是基本类型
  3. Student s = new Student(); //成员变量是引用类型

  4. B:        一个类的初始化过程
  5.         成员变量的初始化
  6.          默认初始化
  7.         显示初始化
  8.           构造方法初始化

  9. C:子父类的初始化(分层初始化)

  10. 先进行父类初始化,然后进行子类初始化。

复制代码



所以综上所述。

1、static EA eaS = new EA(2);  
打印EA 2

2、先进行父类初始化,然后进行子类初始化。

  1.     EC(int i) {

  2.         // super(); //父类空参构造
  3.         System.out.println("EC " + i);
  4.     }
复制代码

所以打印EB

3、子类初始化
成员变量初始化
  1. EA ea = new EA(1);
复制代码

打印输出EA1

4、子类构造方法
输出EC 2

结果:
  1. EA 2
  2. EB
  3. EA 1
  4. EC 2
复制代码




作者: 以梦为马123    时间: 2015-8-22 14:34
介个人好像我认识
作者: joeywr    时间: 2015-8-22 17:09
vipsong 发表于 2015-8-22 13:06
可以参见

嗯嗯  说的很详细
             有道理   谢谢了
作者: 收获远眺    时间: 2015-8-22 17:24
看到了才知道




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