A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© joeywr 中级黑马   /  2015-8-22 11:34  /  521 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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

第二行和第三行顺序颠倒了  我不知道该怎么理解了……

4 个回复

倒序浏览
本帖最后由 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
复制代码



回复 使用道具 举报
介个人好像我认识
回复 使用道具 举报

嗯嗯  说的很详细
             有道理   谢谢了
回复 使用道具 举报
看到了才知道
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马