黑马程序员技术交流社区

标题: 初始化内存原理,大家谈谈你们自己的理解。 [打印本页]

作者: app297    时间: 2014-1-12 21:29
标题: 初始化内存原理,大家谈谈你们自己的理解。
本帖最后由 app297 于 2014-1-13 16:45 编辑

This的原理图
这个是我的学习笔记,下面是我自己的理解,你们看下理解的对不,也说说你们的理解
当成员变量和局部变量重名时,可以用关键字  this 来区分。
This:代表对象,当前对象
     This就是所在函数所属对象的引用
      简单说:哪个对象调用了this所在的函数,this就代表哪个对象。


看了上图我自己的理解:
Person p = new Person(“旺财”);
1、主函数进栈,变量p, 成员变量进堆内存
2、new出现,构造函数进栈,this引用当前对象,并且进行变量的初始化赋值。
3、构造函数弹栈。  变量p 与 堆内存建立引用;
P.speak();
4、调用的方法函数进栈,并建立与当前对象的引用,并且执行调用语句。
5、函数弹栈。

作者: 李程    时间: 2014-1-12 22:16
楼主,我感觉应该是先有的构造函数进栈,然后在堆内存中开辟空间,这个时候成员变量才进的堆内存,之后对成员变量初始化。完成这些以后把所开辟空间的地址赋值给P
作者: xu6148152    时间: 2014-1-12 22:20
本帖最后由 xu6148152 于 2014-1-12 22:22 编辑

刚刚看到这里的。假设有个类Person,Person p1=new Person();
对象的初始化过程,通过虚拟机JVM加载类,如果有静态代码块,静态代码块执行给class类初始化,在堆内存中开辟空间,分配内存地址,在堆内存中建立对象的特有属性,并进行默认初始化,属性都是NULL,堆属性进行显示初始化,接着是构造代码块初始化,接着是构造函数初始化。将内存地址赋值给内存中的P变量。
作者: 李程    时间: 2014-1-12 23:53
本帖最后由 李程 于 2014-1-13 00:07 编辑
李程 发表于 2014-1-12 22:16
楼主,我感觉应该是先有的构造函数进栈,然后在堆内存中开辟空间,这个时候成员变量才进的堆内存,之后对成 ...

构造函数不是进栈内存,是进的共享区(非静态部分)
作者: app297    时间: 2014-1-13 12:39
李程 发表于 2014-1-12 23:53
构造函数不是进栈内存,是进的共享区(非静态部分)

方法区? 那为什么 在比老师的视频中,讲解内存的时候,都是讲 构造函数进栈了呢?
作者: 李程    时间: 2014-1-13 17:40
app297 发表于 2014-1-13 12:39
方法区? 那为什么 在比老师的视频中,讲解内存的时候,都是讲 构造函数进栈了呢? ...

啊?不会吧,哪一集?多少分钟?
作者: 呢喃的喃呢    时间: 2014-1-13 21:44
方法在调用的时候都会 压栈(push),然后执行完后立刻出栈(pop) 这个是毋庸置疑的。构造函数也是方法,所以不用找视频去了
作者: 李程    时间: 2014-1-13 21:59
呢喃的喃呢 发表于 2014-1-13 21:44
方法在调用的时候都会 压栈(push),然后执行完后立刻出栈(pop) 这个是毋庸置疑的。构造函数也是方法, ...

方法进的不是方法区吗?
作者: app297    时间: 2014-1-13 22:31
李程 发表于 2014-1-13 21:59
方法进的不是方法区吗?

看了后面的续集。 我分清楚了, 我上面说的没得错。
但是你说的方法是进方法区,这个也是对的,但是这个是指的是 类加载,不是对象,好比一个码表,你要使用的时候就要去查码表,  这个码表就好比类加载进了方法区存放。
产生的对象,中的方法是要进栈的,但是在同时会查询方法区中的码表
作者: 李程    时间: 2014-1-14 09:45
app297 发表于 2014-1-13 22:31
看了后面的续集。 我分清楚了, 我上面说的没得错。
但是你说的方法是进方法区,这个也是对的,但是这个 ...

嗯嗯,是的是的,我也是刚反应过来




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