黑马程序员技术交流社区

标题: 一个对象的实例化的过程是什么? [打印本页]

作者: 不再上网    时间: 2014-8-15 19:39
标题: 一个对象的实例化的过程是什么?
一个对象的实例化的过程是什么?

作者: 安宁.沉睡    时间: 2014-8-15 20:52
对象的实例化过程
ArrayToolDemo A=New ArratToolDemo();   
此命令的运行过程如下

1.        加载  将类的class文件从硬盘中加载到内存中(一个程序最多加载一次)
2.        创建类的方法空间
3.        创建类的静态属性,并默认初始化
4.        静态属性显示初始化  //static int a=1;
5.        运行静态代码块      
6.        将方法空间地址送入类名保存
7.        开辟堆空间            
8.        建立对象属性,并默认初始化   int型默认初始化为0 string型默认初始化null
9.        对象属性显示初始化    int a=20;
10.        运行构造代码块
11.        运行构造函数
12.        将内存地址送入对象名

作者: 周靖轩    时间: 2014-8-15 22:07
安宁.沉睡 发表于 2014-8-15 20:52
对象的实例化过程
ArrayToolDemo A=New ArratToolDemo();   
此命令的运行过程如下

学习了,
作者: 安宁.沉睡    时间: 2014-8-15 23:38
周靖轩 发表于 2014-8-15 22:07
学习了,

回答满意就帮我置顶哦~~:lol
作者: 冷锋也温柔    时间: 2014-8-16 00:22
借鉴下  太详细了
作者: fantacyleo    时间: 2014-8-16 00:36
安宁.沉睡 发表于 2014-8-15 20:52
对象的实例化过程
ArrayToolDemo A=New ArratToolDemo();   
此命令的运行过程如下

其实不少步骤没有严格的顺序。比如:
3和4的顺序、9和10的顺序都取决于声明的先后。
11也不全在9、10之后,构造函数调用父类构造函数是在实例成员默认初始化之前完成的,而构造函数的其他语句在实例成员默认初始化和显式初始化之后完成。实际上,实例成员的默认初始化、显式初始化、实例初始化块是被放入构造函数中执行的
构造函数可能在所有静态成员初始化完毕之前就被调用。比如:
class Test {
    static Test t = new Test();
    static int a = 3;
}
则在a初始化之前就会执行构造函数
作者: 安宁.沉睡    时间: 2014-8-16 07:04
fantacyleo 发表于 2014-8-16 00:36
其实不少步骤没有严格的顺序。比如:
3和4的顺序、9和10的顺序都取决于声明的先后。
11也不全在9、10之后 ...

抱歉了,这是我在学初始化过程做的总结,当时没有考虑继承的问题,继承的初始化可能更复杂。
就没有继承而言的话,3.4,9,10是有顺序的,这个我在当时运行验证过了,谢谢你的补充:)
作者: 安宁.沉睡    时间: 2014-8-16 07:21
fantacyleo 发表于 2014-8-16 00:36
其实不少步骤没有严格的顺序。比如:
3和4的顺序、9和10的顺序都取决于声明的先后。
11也不全在9、10之后 ...
  1. public class Time {
  2.         public static void main(String[] args) {
  3.                 Test T=new Test();
  4.         }

  5. }
  6. class Test {
  7.     static Test t = new Test();
  8.     static int a = 3;
  9.     {
  10.             System.out.println(a);
  11.     }
  12. }

复制代码

运行结果为
0
3
说明在主函数中Test T=new Test();
T对象初始化中,属性的t,和a的建立在在构造函数之前 ,先输出0代表先建立了属性t,后输出3代表建立t和a之后运行了构造函数
你所说的先执行构造函数 其实那是在建立t属性时执行另一个对象初始化
static Test t = new Test();
但是先输出0 ,代表在这个初始化中也是先建立了属性a,并默认初始化为0后才运行的构造函数

作者: fantacyleo    时间: 2014-8-16 11:43
安宁.沉睡 发表于 2014-8-16 07:04
抱歉了,这是我在学初始化过程做的总结,当时没有考虑继承的问题,继承的初始化可能更复杂。
就没有继承 ...

3和4的顺序、9和10的顺序跟继承没关系,只取决于声明的先后。
作者: fantacyleo    时间: 2014-8-16 11:47
安宁.沉睡 发表于 2014-8-16 07:21
运行结果为
0
3

这个是我少打了两个字,抱歉,应该是在a【显式】初始化之前就会执行构造函数




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