java中创建对象的步骤是怎么样的?

老师说,先new了一个对象,在堆内存中开辟空间
然后就是赋默认值(没有静态代码块)
接着就是调用对应的构造函数进栈。
执行隐藏的步骤。
1:super()
2:对非静态变量进行赋显示值
3:执行构造代码块
最后执行构造函数代码块。
然后构造函数出栈。把地址传递给接受的变量。

大家已经说的够多了,估计也听得差不多了。这种问题也只会在面试或者考试出现,实际编程中写成这样,早被打死了。老师说的概念太拗口,这样说你可能会好理解一点,普通的初始化代码其实是一个假象,命令行下用javac编译之后,会发现所有的初始化块都没了,其实它被还原到每个构造器中,并且位于构造器所有代码的前面,这样再看你的程序是不是就很清楚了?嘿嘿。

可是我做的时候发现不是这样子的,难道是老师讲错了。图片说明

为什么这个时候输出的构造代码中a不是5了!!!!!!!!!!!

顺序是
静态变量、静态初始化块、变量、初始化块、构造器
从输出结果来看,没问题。
执行构造函数时,有个a=i,也就是a=5的赋值

构造器的初始化比一般方法先

    你们老师说的流程是对的,只是不完整,就是非静态代码块的执行,也就是你给出的代码,非静态代码是先于构造函数执行的。其实非静态代码块是合并到构造函数中的,而且执行时成员变量还没有被赋值,而是使用的默认值,所以你的a先输出的是0.

1,加载.class文件进方法区,并进行空间分配。
2,如果有静态变量,先默认初始化,显示初始化。
3,如果有静态代码块,要执行,仅一次。
4,通过new在堆内存中开辟空间,并明确首地址。
5,对对象中的属性进行默认初始化。
6,调用对应的构造函数进行初始化。
7,构造函数内部。
7.1 调用父类构造函数super();
7.2 成员变量的显示初始化。
7.3 构造代码块初始化。
7.4 构造函数内容自定义内容初始化。
8,对象初始化完毕后,将地址赋值给d引用变量。

静态代码块执行和静态变量默认初始化的执行顺序依赖于二者的代码顺序,非静态代码块和非静态变量也是一样

输出结果没有问题,代码块在构造前执行

输出结果没有问题,代码块在构造前执行

您的输出顺序是没有问题的,而且老师说也是没有问题的,只是 调用父类构造函数super(); 后, 成员变量的显示初始化而此时默认值是零,且成员变量还没有被赋值,所以会显示以上的结果。

这是执行顺序的问题http://www.cnblogs.com/sophine/p/3531282.html
CodeBlock03的静态代码块
CodeBlock03的主方法
Code的静态代码块
Code的构造块
Code的构造方法
Code的构造块
Code的构造方法
CodeBlock03的构造块
CodeBlock03的构造方法
CodeBlock03的构造块
CodeBlock03的构造方法