黑马程序员技术交流社区

标题: 对象调用成员过程的疑惑 [打印本页]

作者: 曹春贵    时间: 2013-3-17 23:01
标题: 对象调用成员过程的疑惑
本帖最后由 曹春贵 于 2013-3-18 09:22 编辑

正在学习毕老师第6天第8个视频——对象调用成员过程,其中Person的static方法被加载到方法区后,为什么非静态的方法接着被加载了,它就应该接着被加载吗?后面老师画图讲解时,调用setName方法是在栈内存中开辟,并没有用到方法区中加载的非静态方法setName,是不是整个过程就没有用到?如下图,老师画的部分一直没有使用的痕迹。

作者: txl    时间: 2013-3-17 23:21
占个沙发   貌似不是很困难
作者: 爪哇攻城狮    时间: 2013-3-17 23:26
一般顺序:静态块——>静态变量——>成员变量——>构造方法——>静态方法。
静态方法先加载进来,
作者: mingning179    时间: 2013-3-17 23:34
方法代码只存一份,所以开始就加载,没有问题。其次调用setName方法的时候开辟那些个内存空间用来存放的是各种变量,比如方法传入的参数,以及一些临时产生的变量,而不是方法本身的代码。不知道我说到问题的要点没有...{:soso_e101:}

作者: 张雪萍    时间: 2013-3-17 23:59
先说一下栈的特点,不知道你有没有学过数据结构,栈有一个特点,是先进后出,举个例子,假如进栈的顺序是3,6.1,9.那么出栈的顺序是9,1,6,3,也就是最先进去的最后出,这就像是死胡同,只有最外边的人才能现出来。栈的这种特点正好用来运行程序时加载内存。我在举个例子来说明方法区和堆的作用。
比如说加工食品,堆中用来存放原料之类的,方法区用来存放制作食品的工具,那么当我们执行制作食品的程序时,要把原料和工具都放在一个房间内来加工,那么栈就是这个房间,当加工完毕之后,先进去的东西就出栈,好空出房子来继续干别的事情,
这个例子没有考虑一些具体的情节,比如有些原料像静态变量就放在方法区,这是些例外规则,但是大体过程是对的,细节自己加强。
至于你说的其中Person的static方法被加载到方法区后,为什么非静态的方法接着被加载了,它就应该接着被加载吗?
主函数运行时,就把该类中所有成员都加载到相应内存中,至于具体精确的加载顺序,那就看你的代码顺序了。
不是说用到哪个方法才加载哪个方法,是用到哪个方法,就调用哪个方法。加载和调用是不一样的。注意理解,加载是从没有到有,调用时原来有再拿过来用。
java注意理解思想。
作者: 曹春贵    时间: 2013-3-18 01:06
mingning179 发表于 2013-3-17 23:34
方法代码只存一份,所以开始就加载,没有问题。其次调用setName方法的时候开辟那些个内存空间用来存放的是 ...

嗯,理解了
作者: 曹春贵    时间: 2013-3-18 01:07
张雪萍 发表于 2013-3-17 23:59
先说一下栈的特点,不知道你有没有学过数据结构,栈有一个特点,是先进后出,举个例子,假如进栈的顺序是3, ...

受教了,学习了很多
作者: 李尧    时间: 2013-3-18 01:14
兄弟,你这问题算是已经解决了吧...那是不是把帖子的状态改一下吖....我兴冲冲的点进来....欺骗我感情吖...




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