黑马程序员技术交流社区
标题:
关于实例化?
[打印本页]
作者:
张金
时间:
2012-11-13 18:39
标题:
关于实例化?
本帖最后由 张金 于 2012-11-24 13:51 编辑
继承了父类的子类,在实例化过程中,到底都做了些什么啊,在内存中都发生了什么,子类实例化过程是一个什么样子啊?
作者:
黑_礼_服
时间:
2012-11-13 20:18
子类继承了父类 实例化其子类 子类对象就可以调用用父类中所有的公开的属性和方法
关于在内存中的存储 子类里有一个区域放的父类的实例,子类内存区里有一个this指针,指向了这个内存区里包括的父类实例区,当把引用付给父类时,是把子类内存区里面的父类实例区域的引用给了父类的实例.
作者:
徐军涛
时间:
2012-11-13 20:30
子类对象在内存中产生过程:
1,
将该对象所需的类文件加载进内存的(方法区)
2,
在(栈)内存进行方法区的空间分配。
3,
通过
new
在堆内存中开辟空间。
4,
对象中的属性进行默认初始化
5,
调用与之对应的构造函数进行初始化
6,
通过构造函数中的
super
调用父类中的构造函数初始化。
7,
对象中属性进行初始化
8,
构造代码块初始化
9,
该构造函数内部自定义内容进行初始化。
作者:
黑马张旭
时间:
2012-11-15 17:18
编译并运行该程序会有以下输出 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()。
作者:
黑马张旭
时间:
2012-11-15 17:21
上面的代码中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 、继承关系中,必须要父类初始化完成后,才初始化子类。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2