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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 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、函数弹栈。

评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1 神马都是浮云

查看全部评分

9 个回复

倒序浏览
楼主,我感觉应该是先有的构造函数进栈,然后在堆内存中开辟空间,这个时候成员变量才进的堆内存,之后对成员变量初始化。完成这些以后把所开辟空间的地址赋值给P
回复 使用道具 举报
本帖最后由 xu6148152 于 2014-1-12 22:22 编辑

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

构造函数不是进栈内存,是进的共享区(非静态部分)
回复 使用道具 举报
李程 发表于 2014-1-12 23:53
构造函数不是进栈内存,是进的共享区(非静态部分)

方法区? 那为什么 在比老师的视频中,讲解内存的时候,都是讲 构造函数进栈了呢?
回复 使用道具 举报
app297 发表于 2014-1-13 12:39
方法区? 那为什么 在比老师的视频中,讲解内存的时候,都是讲 构造函数进栈了呢? ...

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

方法进的不是方法区吗?
回复 使用道具 举报
app297 中级黑马 2014-1-13 22:31:46
9#
李程 发表于 2014-1-13 21:59
方法进的不是方法区吗?

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

嗯嗯,是的是的,我也是刚反应过来
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马