2 readigg READIgg 于 2016.03.03 00:05 提问

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

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

12个回答

luochoudan
luochoudan   Ds   Rxr 2016.03.03 11:30
已采纳

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

blwinner
blwinner   2016.03.03 09:07

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

qq_20039385
qq_20039385   2016.03.03 09:21

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

READIgg
READIgg   2016.03.03 00:08

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

READIgg
READIgg   2016.03.03 00:09

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

danielinbiti
danielinbiti   Ds   Rxr 2016.03.03 00:36

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

namelin2
namelin2   2016.03.03 02:49

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

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

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

READIgg
READIgg 说的很好,谢谢了。
接近 2 年之前 回复
u012348901
u012348901   2016.03.03 09:43

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

共12条数据 1 尾页
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!