黑马程序员技术交流社区

标题: 请教如何理解堆内存和方法区 [打印本页]

作者: 黎志文    时间: 2013-5-29 14:19
标题: 请教如何理解堆内存和方法区
1.这两个内存区域分别用来存储什么东西?

2.非静态成员变量和静态成员变量分别存储在哪?非静态方法和静态方法又存储在哪?

3.静态代码块,静态成员变量,构造代码块,构造函数这四个内容在内存里面执行的先后顺序是什么?

这两天被这几个问题搞得头大?恳请大神指教,谢谢了!

作者: 喜欢流浪    时间: 2013-5-29 14:41
1、堆内存主要是存放用new产生的数据 ;方法区存放static修饰的方法,对象
2、非静态成员变量,其中变量名(引用变量)存放在栈内存,其实际数据在堆内存中,引用变量指向这些实际数据的地址池;静态成员变量存放在方法区;静态方法也存放在方法区,非静态方法其实和非静态成员变量一样;
3、 顺序是,静态代码块,构造代码块,构造函数
作者: 黎志文    时间: 2013-5-29 15:05
喜欢流浪 发表于 2013-5-29 14:41
1、堆内存主要是存放用new产生的数据 ;方法区存放static修饰的方法,对象
2、非静态成员变量,其中变量名 ...

那静态成员是随着类的加载而加载么?静态成员和静态代码块执行的先后顺序又是怎样的?
作者: 黑马-许鹏    时间: 2013-5-29 15:30
黎志文 发表于 2013-5-29 15:05
那静态成员是随着类的加载而加载么?静态成员和静态代码块执行的先后顺序又是怎样的? ...

静态成员先执行,因为静态代码块中有可能要引用静态成员变量。
作者: 喜欢流浪    时间: 2013-5-29 15:58
黎志文 发表于 2013-5-29 15:05
那静态成员是随着类的加载而加载么?静态成员和静态代码块执行的先后顺序又是怎样的? ...

已经有人回答了  我就不便回答了!
作者: 黎志文    时间: 2013-5-29 18:19
黑马-许鹏 发表于 2013-5-29 15:30
静态成员先执行,因为静态代码块中有可能要引用静态成员变量。

既然是静态成员先执行,那为何我这样写:
static
{
      System.out.println("我是静态代码块"+country);
}
static String country = "china";
     系统会报错“错误: 非法前向引用”,按照你的逻辑,静态成员先执行,那么我这两个代码的先后顺序就没有关系,因为静态成员已经执行了,那么静态代码块写在前面,仍然是可以调用country的,可实际结果却并非如此,静态代码块写在country前面系统会报错。
   会不会是这样,静态代码块和静态成员变量是相同级别,但是按它们的先后顺序来执行??
作者: HM张博文    时间: 2013-5-29 19:07
这种概念问题我最怕了,参考楼上的回答吧




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