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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 阿里策 中级黑马   /  2013-9-26 17:55  /  2068 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 阿里策 于 2013-9-27 10:14 编辑

    看教学视频看到面向对象-对象初始化那块有两个疑问:(1)类加载时,是先执行静态成员,然后再执行静态代码块的吧?(2)加载的存放在内存的哪部分呢?是存放在方法区(也叫共享区、数据区)吗?
问题背景:
public static void main(String args[]){
    Person p = new Person();        
}
其中Person p = new Person();的执行顺序是:首先在栈中生成一个引用变量p --->寻找并加载Person.class类,将其加载到内存的某个地方(哪里??)
--->执行静态代码块 --->在堆内存中开辟内存空间,分配内存地址 ---> 对象成员变量的初始化 --->成员变量显示初始化 --->构造代码块初始化 --->构造函数初始化 --->将对象的堆内存地址赋给栈中的引用变量p

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

5 个回复

倒序浏览
(1)构造方法在对象实例化时非静态初始化块执行结束以后被执行,同级别的安先后顺序执行。非静态初始化块在对象实例化时构造方法被调用之前被执行,同级别的按先后顺序执行。
(2)程序加载主函数,在栈内存中开僻空间。Person p 在栈中生成引用变量,new 的对象存放在堆内存中。

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
关于各模块的加载顺序:
static变量的优先级要比static代码块高得多
先是static变量,然后才是static代码块,所以那种对于class.Forname加载类,只调用static代码块的误区要克服,因为还有一个static代码块在等着你
回复 使用道具 举报 1 0
对象的初始化过程


Person p = newPerson("zhangsan",20);


该句话都做了什么事情?

1,因为new用到了Person.class.所以会先找到Person.class文件并加载到内存中。

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

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

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

5,对属性进行显示初始化。

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

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

8,将内存地址付给栈内存中的p变量。
对象初始化就这八步

评分

参与人数 1技术分 +1 收起 理由
EYE_SEE_YOU + 1

查看全部评分

回复 使用道具 举报
     这位同学问的问题应该就是对象初始化过程的问题, 可以好好看看雨发给你的这八步
回复 使用道具 举报
云水禅心 发表于 2013-9-26 22:13
这位同学问的问题应该就是对象初始化过程的问题, 可以好好看看雨发给你的这八步 ...

    我的问题背景中也有这八步,我的问题重点是:(1)是静态成员变量先执行,还是静态代码块先执行?(2)加载类时将类存入内存,是存放到了哪里,是存放到区方法中了吗?    问题一已经被沙发回答,问题二通过查阅得知加载的类确实已经存到了方法区中。谢谢合作

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