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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© amen0205 中级黑马   /  2013-3-3 18:48  /  1879 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 门文通 于 2013-3-4 10:57 编辑

Person p=new Person();
问:执行static代码块来为类初始化和在堆中开辟空间并分配内存地址哪个先执行?
      这两个步骤没有什么联系对吧,所以谁先执行都可以吧?


还有问下  你们帖子中的代码和前面的数字是怎么编辑进去的?

8 个回复

倒序浏览
静态代码块先执行,而且只是在类加载时执行一次.
这俩个步骤有严格的执行顺序...java的每一项规则都是严格的,存在就是有意义的...
静态代码块先执行,然后执行构造代码块,为引用变量p在栈内存中开辟空间.new后调用构造函数,
关于静态代码块的作用是用来初始化类中只使用一次的对象.
回复 使用道具 举报
1,因为new用到了Person.class文件,所以会先找到它并加载到内存中。

2,执行该类中静态代码块,如果有的话、给Person.class初始化。

3,在堆内存中开辟空间,分配内存地址。

4,在对内存中建立对象的特有属性,并进行默认初始化。

5,对属性显示初始化。

6,对对象进行构造代码块初始化。

7,对对象进行对应的构造函数初始化。

8,将内存地址赋给栈内存中的变量。
回复 使用道具 举报
当然要静态代码块先执行,而且这两个不仅没联系,只要涉及到static 静态和堆内存基本也没联系的,static静态修饰的方法 ,成员都单独存在在一个方法区中的,不涉及到堆内存。剩下的楼上说的很全面了
回复 使用道具 举报
静态代码块先执行,前提是有静态代码块。对Person.class类进行初使化。然后才在堆内存中建立对象的属性,分配内存地址。
回复 使用道具 举报
他们都把你前边的问题回答了,但没人回答你后边的问题,太不人道了。我告诉你,你去看这个帖子,一切都明白了。
论坛发言小技巧:http://bbs.itheima.com/thread-37643-1-1.html
回复 使用道具 举报
呵呵,赵海洋好强大!威武!
楼主的问题,一旦这个类被装载,所有的static语句被运行而且Static 块仅在该类被加载时执行一次
在Java中,类装载器把一个类装入Java虚拟机中,要经过三个步骤来完成:装载、链接和初始化,其中链接又可以分成校验、准备和解析三步,除了解析外,其它步骤是严格按照顺序完成的,各个步骤的主要工作如下:
装载:查找和导入类或接口的二进制数据;
链接:执行下面的校验、准备和解析步骤,其中解析步骤是可以选择的;
校验:检查导入类或接口的二进制数据的正确性;
准备:给类的静态变量分配并初始化存储空间;
解析:将符号引用转成直接引用;
初始化:激活类的静态变量的初始化Java代码和静态Java代码块。
想想也是呀,只有static块被执行你的初始化操作才能进行啊,
回复 使用道具 举报
克零岚 发表于 2013-3-3 20:28
呵呵,赵海洋好强大!威武!
楼主的问题,一旦这个类被装载,所有的static语句被运行而且Static 块仅在该类 ...

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