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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张金 中级黑马   /  2012-11-13 18:39  /  1400 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张金 于 2012-11-24 13:51 编辑

继承了父类的子类,在实例化过程中,到底都做了些什么啊,在内存中都发生了什么,子类实例化过程是一个什么样子啊?

4 个回复

倒序浏览
子类继承了父类  实例化其子类 子类对象就可以调用用父类中所有的公开的属性和方法
关于在内存中的存储 子类里有一个区域放的父类的实例,子类内存区里有一个this指针,指向了这个内存区里包括的父类实例区,当把引用付给父类时,是把子类内存区里面的父类实例区域的引用给了父类的实例.
回复 使用道具 举报
子类对象在内存中产生过程:
1, 将该对象所需的类文件加载进内存的(方法区)
2, 在(栈)内存进行方法区的空间分配。
3, 通过new在堆内存中开辟空间。
4, 对象中的属性进行默认初始化
5, 调用与之对应的构造函数进行初始化
6, 通过构造函数中的super调用父类中的构造函数初始化。
7, 对象中属性进行初始化
8, 构造代码块初始化
9, 该构造函数内部自定义内容进行初始化。

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报

  编译并运行该程序会有以下输出 Static Block Employee Company:china soft Non-Static Block Employee phone:0755-51595599 Employee(String) Empoloyee() 下面我们来对结果做分析: 1 在代码34行实例化对象时, 先对给静态变量分配内存空间并初始化,然后执行静态块。 因此,在这里会输出: Static Block Employee Company:china soft Employee Company:china soft的输出也说明是先初始化静态变量然后再执行静态块,否则company将为null。 2然后在内存中为Employee分配内存空间,并做默认初始化(即所有变量初始化为默认值,这里都初始化为null)。 3 默认初始化完成后,开始显示初始化。即执行第5行,将phone初始化"0755-51595599",并且执行非静态方法块;因此在这里会有以下输出: Non-Static Block Employee phone:0755-51595599 4 最后才调用默认构造函数,在默认构造函数中调用了带参数的构造函数,所以在这里先输出带参数构造函数中的:Employee(String),然后才输出:Empoloyee()。
回复 使用道具 举报

上面的代码中Manager继承了前面写的Employee类,当我们编译并运行Manager类,会产生以下的输出:

Static Block Employee Company:china soft Sub Static Block Manager department:sale Non-Static Block Employee phone:0755-51595599 Employee(String) Empoloyee() Sub Non-Static Block Manager salary:8000 Manager(String) Manager() 下面我们对结果做分析: 1 在行34实例化对象时,由于Manager继承了Employee,所以先从父类Employee开始;先给父类静态变量分配内存空间并初始化,然后执行父类静态块。然后再给子类静态变量分配内存空间并初始化,然后执行子类静态块,所以会得到以下输出: Static Block Employee Company:china soft Sub Static Block Manager department:sale

2然后在内存中为父类Employee分配内存空间,并做默认初始化;再为子类Manager分配内存空间,并做默认初始化。 3默认初始化完成后,从父类开始显示初始化并执行非静态方法块和构造函数,然后再子类开始显示初始化并执行非静态方法块和构造函数。因此会产生以下的输出: Non-Static Block Employee phone:0755-51595599 Employee(String) Empoloyee() Sub Non-Static Block Manager salary:8000 Manager(String) Manager()

总结以上内容,可以得到对象初始化过程:

1、 如果存在继承关系,就先父类后子类;

2 、如果在类内有静态变量和静态块,就先静态后非静态,最后才是构造函数;

3 、继承关系中,必须要父类初始化完成后,才初始化子类。

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马