黑马程序员技术交流社区

标题: 求助求助,内存问题,各位高手麻烦帮忙给仔细讲讲 [打印本页]

作者: 徐传任    时间: 2012-9-20 21:24
标题: 求助求助,内存问题,各位高手麻烦帮忙给仔细讲讲
大家好,最近学习java但是对内存分布一直不是很清楚,麻烦各位高手帮忙给仔细讲讲,我问两个问题:
1.内存分为哪几个部分?各部分都存储哪些内容?



2.public class Test {
      public static void main(String[] args)  {
           int i = 1;//i在栈内存中,那常量1在内存的哪个部分?也在栈内存中吗?
           i = i ++;//这个式子在内存中是怎么计算的
          int a = i;//为什么上面i++了,但是在此a的值还是3啊,内存中怎么执行的。
          System.out.println(a);
          System.out.println(i);
     }
}
//这个小程序的结果是不是都是3?麻烦给讲一下变量在内存中是怎么分配的,以及i = i++;在内存中是怎么计算的,谢谢了, 兄弟们,麻烦给我上图啊(画个内存图)

3.迷糊了内存就迷糊了一切,我快完了,我迷糊了,麻烦大家帮我仔细解释下,谢谢了


作者: 严海荣    时间: 2012-9-20 21:56
1.◆寄存器:我们在程序中无法控制

◆栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中

◆堆:存放用new产生的数据

◆静态域:存放在对象中用static定义的静态成员

◆常量池:存放常量

◆非RAM存储:硬盘等永久存储空间
2.打印的a和i 都是1.
  1. public class TestFor {
  2.         public static void main(String[] args) {
  3.                 int i = 1;//
  4.                 i = i++;// i++时传给i的值,是没有+1的,
  5.                                 //穿完值后i++这块变成2了,但是你已经将i为1的值传给i了
  6.                 //i=++i;//如果换成++i,就是先把i的值加1后传给i,就是变成了2了,
  7.                 int a = i;// 这里只是给a赋i的值
  8.                 System.out.println(a);
  9.                 System.out.println(i);
  10.         }
  11. }
复制代码
基础类型 就一块内存,在栈中。
这题在内存中,应该都是在栈中计算,赋值的。
主要记住i++和++i,前者先穿值后自增,后者先自增再传值。
引用类型 放两块内存 栈中是引用变量,堆中是new出来的。
3,内存这块看毕老师的视频,来回多看几遍就混熟了。

作者: 徐传任    时间: 2012-9-20 22:00
严海荣 发表于 2012-9-20 21:56
1.◆寄存器:我们在程序中无法控制

◆栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而 ...

常量池都是存储哪些常量啊,麻烦给举个例子
作者: 严海荣    时间: 2012-9-20 22:15
常量池指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。除了包含代码中所定义的各种基本类型(如int、long等等)和对象型(如String及数组)的常量值(final)还包含一些以文本形式出现的符号引用,比如:

◆类和接口的全限定名;

◆字段的名称和描述符;

◆方法和名称和描述符。

虚拟机必须为每个被装载的类型维护一个常量池。常量池就是该类型所用到常量的一个有序集和,包括直接常量(string,integer和 floating point常量)和对其他类型,字段和方法的符号引用。

对于String常量,它的值是在常量池中的。
String s = "abc";
"abc"就是存常量池里的
作者: 王小闲7    时间: 2012-9-21 00:22
标题: RE: 求助求助,内存问题,各位高手麻烦帮忙给仔细讲讲
严海荣 发表于 2012-9-20 21:56
1.◆寄存器:我们在程序中无法控制

◆栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而 ...

“穿完值后i++这块变成2了,但是你已经将i为1的值传给i了”
那i++后变成了2,这个2的值去了哪里

作者: AngieFans85    时间: 2012-9-21 00:42
本帖最后由 马镱洵 于 2012-9-21 00:44 编辑
王小闲7 发表于 2012-9-21 00:22
“穿完值后i++这块变成2了,但是你已经将i为1的值传给i了”
那i++后变成了2,这个2的值去了哪里
...


不用去细究,这一点和c++的又不一样了.
这是没有固定的原理的.如果硬要找个理由来解释java中的这个现象是为什么,那么在c++中又该用什么理由去解释为什么同一个代码,但是结果却不同呢.
作者: 王小闲7    时间: 2012-9-21 08:49
马镱洵 发表于 2012-9-21 00:42
不用去细究,这一点和c++的又不一样了.
这是没有固定的原理的.如果硬要找个理由来解释java中的这个现象是 ...

我觉得这种问题就现在的水平根本无法解释清楚,所以我觉得只需要记住就可以了,如果非要得到答案的话,还是要请教高手。个人观点,仅供参考。
作者: AngieFans85    时间: 2012-9-21 17:24
王小闲7 发表于 2012-9-21 08:49
我觉得这种问题就现在的水平根本无法解释清楚,所以我觉得只需要记住就可以了,如果非要得到答案的话,还 ...

很好,你很有觉悟;P




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