黑马程序员技术交流社区

标题: 关于对象的初始化过程 [打印本页]

作者: 杨建聪    时间: 2013-1-7 16:45
标题: 关于对象的初始化过程
本帖最后由 张向辉 于 2013-1-16 11:53 编辑

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

这句话在内存中都做了什么事情?

1.因为new用到了Person.class,所以会先找到Person.class文件并加载到内存中
2.执行该类中的static代码块,如果有的话,给Person.class类进行初始化
3.在堆内存中开辟空间,分配内存地址
4.在堆内存中建立对象的特有属性,并进行默认初始化
5.对属性进行显示初始化
6.对对象进行构造代码块初始化
7.对对象进行对应的构造函数初始化
8.将堆内存中的地址给栈内存中的p变量




第五步,对属性进行显示初始化是什么意思?百思不得其解{:soso_e117:}


作者: 舒远    时间: 2013-1-7 17:02
简单说就是赋初始值呀。
作者: 黄锦成    时间: 2013-1-7 17:04
就是如果你在定义属性时赋值了,就是执行这一步:如int num = 4; 先赋默认值0,然后显示初始化赋值4
作者: 何竹冬    时间: 2013-1-7 22:09
你好
  1. public class Person
  2. {
  3.         private String name="lisi";//默认初始化name值为null,显示初始化为lisi
  4.         private int age=10;//默认初始化age值为0,显示初始化为10
  5.         //构造函数初始化
  6.         Person(String name,int age)
  7.         {
  8.                 this.name=name;
  9.                 this.age=age;
  10.         }
  11.         
  12.         public static void main(String[] args)
  13.         {
  14.                 Person p=new Person("zhangsan",20); //调用构造函数初始化
  15.         }
  16. }
复制代码

作者: sun~~    时间: 2013-1-7 23:41
就是你在定义属性时简单的赋值.
作者: 杨远    时间: 2013-1-8 09:50
本帖最后由 杨远 于 2013-1-8 09:51 编辑
  1. class  PersonA
  2. {
  3.         String name;
  4.         int age;
  5. }

  6. class PersonB
  7. {
  8.         String name = "lisi";
  9.         int age = 10;
  10. }
复制代码
4楼何竹东的例子已经给出解释了。我做个补充:
显示初始化是和默认初始化只是对初始化进行细分时取不同的名字以进行区分的。
上面我的代码,可以这样来初步理解,
PersonA是定义了变量但没有赋值,即没有初始化;
PersonB定义了变量同时赋了值,即初始化了。
但实际上对于PersonA的情况,并不是没有赋值的,他是有初始值的,如String类型的是null,int类型的是0。
这个默认的赋值就叫做默认初始化。
而同样对于PersonB,实际上就也是先进行默认初始化后,再进行你给定的赋值,为示区别,这一步叫显示初始化。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2