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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© _let'sgo 中级黑马   /  2015-11-12 16:38  /  789 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 _let'sgo 于 2015-11-12 16:41 编辑

结果为什么是
Fu
zi show 0
Zi
zi show 0
,初始化时执行顺序是什么?

  1. class Fu{
  2.        int num = 9;

  3.        {
  4.             System.out.println("Fu" );
  5.        }

  6.       Fu(){
  7.              super();//Object
  8.              //显示初始化
  9.              //构造代码块初始化
  10.             show();
  11.        }
  12.        void show(){
  13.             System.out.println("fu show " + num);//被覆盖,运行子类的
  14.        }
  15. }

  16. class Zi extends Fu{
  17.        int num = 8;

  18.       {
  19.             System.out.println("Zi" );
  20.       }

  21.       Zi(){
  22.              super();
  23.              //显示初始化
  24.              //构造代码块初始化
  25.             show();
  26.       }

  27.        void show(){
  28.             System.out.println("zi show " + num);
  29.        }
  30. }

  31. public class Demo{
  32.        public static void main(String[] args){
  33.              new Zi();
  34.        }
  35. }
复制代码



7 个回复

倒序浏览
。。。。
回复 使用道具 举报
Fu
zi show 0
Zi
zi show 8
这样吧
回复 使用道具 举报
在对子类对象进行初始化时,父类的构造函数也会运行,
因为子类的构造函数默认第一行有一条隐式的语句super();
所以先运行“Fu”
然后Fu方法中没有创建对象,所以num初始化为默认int类型数值为0
所以是 zi show 0
然后是子类成员变量初始化 num赋值给8
然后是运行子类的代码块 “Zi”
因为new一个Zi()已经分配空间
这时num已经被赋值给8
所以zi show 8
顺序就是
Fu
zi show 0
Zi
zi show 8
回复 使用道具 举报
楼上说的很正确
回复 使用道具 举报
学习.{:2_32:}{:2_32:}{:2_32:}
回复 使用道具 举报
女神 中级黑马 2015-11-13 22:10:59
7#
z13561291 发表于 2015-11-12 20:29
在对子类对象进行初始化时,父类的构造函数也会运行,
因为子类的构造函数默认第一行有一条隐式的语句super ...

运行过程
new ZI()  找到子类的构造方法   然后看到super()调用父类的,然后找到父类的构造方法,先运行的代码是 int num = 9    然后是构造代码块  打印一个fu  然后开始运行父类的构造方法, 看到需要调用show()  然后去子类找show方法,因为num 子类没有赋值呢  默认初始化值为0   所以打印的是zi show 0
然后父类的构造方法运行完毕,找到子类的构造方法,执行 int num = 8   接着执行子类的构造代码块  打印 zi
然后发现子类构造方法调用了 show 方法, 在子类找show方法,运行后打印的是 zi show 8
回复 使用道具 举报
oup 中级黑马 2015-11-13 22:43:58
8#
看得有点晕
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马