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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

复习看了下内存结构这块,比如Person p= new Person();在内存中都做了什么,有两个地方不好理解,显示初始化,默认初始化,啥叫显示初始化。默认就完了呗

6 个回复

倒序浏览
1:因为new用到了person.class,所以会先找到Person类文件并加载到内存中。

2:执行该类中的static静态代码块,如果存在,即给person类进行初始化。

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

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

5:对属性进行顺序初始化。

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

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

8:将内存地址值赋给栈内存中的P变量。

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

回复 使用道具 举报
我个人是这样理解的:在创建一个对象时在内存中开辟了一片内存空间,并建立了对象的一些属性(如人的姓名年龄等)。还将这个空间的地址值传给了对象名使得对象名指向其所代表的对象。默认初始化是对属性变量的第一次赋值是变量在没有收到参数时虚拟机给的默认值(字符串为null,数字为0等),显示初始化是在接收到参数时对属性变量进行赋值,这次赋的值就是我们所传入的值(即new对象时传入的参数值)。

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
啥叫显示初始化。默认就完了呗。
显示初始化是你给成员字段赋的值。
默认初始化,是jvm虚拟机为保证每个成员都被初始化自动先赋的值,例如int类型为0

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
默认初始化就是在堆中构造对象的时候你的成员变量不管你在类定义中赋值没有首先它先给他们一个初始化的值
String和其他类类型类型为null
int,short,byte是0
long是0L
float是0.0f
double是0.0d
char是'\u0000'
boolean是fasle
这就是所谓的默认初始化,然后如果你在类中定义了一些初值,此时再通过你给的值赋值到相应成员变量中这叫显示初始化
比如你在类里写一个成员变量
int age = 23;
先进行默认初始化age是0,然后再根据你的值显示初始化age=23;
希望能帮助你理解

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
况仕 发表于 2012-5-25 09:16
1:因为new用到了person.class,所以会先找到Person类文件并加载到内存中。

2:执行该类中的static静态代 ...

总结的挺全了~~~~
回复 使用道具 举报
whocases 黑马帝 2012-5-25 13:31:39
7#
Person p= new Person();
高手不少啊,基本同意他们的观点。
大体过程是:1.开辟内存空间。2加载相应的class,相应的静态静态代码块也加载进来。3.创建对象和p,调用构造方法(调用构造方法是默认执行的,只执行一次),给对象中的成员变量进行赋值(如没有指定值的话,jvm会自动给相应的成员变量赋默认值)。4.把创建好对象的地址赋值给 p。(不考虑父类的情况下)

这应该就是大体的全过程吧。
说明:理解了这句话,在工作中优化代码的时候有一定的好处,个人小小的经验:就是在for循环中不要去创建对象,因为循环一次,就会创建一次,如果循环n次,那么内存...这样做就增加了内存的负担,软件必然会慢,客户必然不满意,收软件费用就麻烦些。老板就找开发经理的麻烦,开发经理就找开发组长的麻烦,组长就找你的麻烦,然后你在处理这些麻烦,悲哀的循环。危言耸听了,危言耸听了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马