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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 凡延海 中级黑马   /  2012-5-26 10:31  /  2801 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

我们int x=20;这里20就是常量吧,x就是变量吧。
我们用x表示内存存储空间的内容,那常量20是如何在内存中表示的呢,求助各位高手。

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

11 个回复

倒序浏览
这问题弄得我都不敢回答。此时x的内容不就是表示的是20.
回复 使用道具 举报
应该是存入常量池中,用二进制表示并把其地址赋给x,这样x就指向了20

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
希望能帮到你

未命名.PNG (17.85 KB, 下载次数: 77)

未命名.PNG

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
呃,20是个常量还是个什么量,主要看你怎么去理解了,如果你第一次使用20这个量去赋值,在正常赋值后,这个量会保存在常量池中,那么此时说它是个常量还是比较靠谱的,等到下次你又来一个变量准备赋值20的时候,虚拟机先从常量池中找,看看有没有20,有的话直接就赋值了,没有的话那么就造一个呗,然后赋值结束后,再把它扔到常量池里,这样循环往复,所以你说20本身这个数是不是个常量我感觉你得从站在哪个角度去看,希望对你有帮助,哈哈

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1 赞一个!

查看全部评分

回复 使用道具 举报
20 以二进制的形式存储在其内存空间中,int 型(基本类型)变量一般存放在栈内存中,当定义int x = 20 时,jvm 首先在某块内存中寻找是否已有一小块内存中存着20,若果有,则将其地址赋给 x,若不存在,则开辟新的小块,存放20,将地址赋给x。我觉得20可以理解为数值。x 被称为变量,是因为其存放的地址可以改变,也就是可以指向不同的值。 如果这样定义: final int X = 20; 则 X 所存放的地址值不能再改变,也就是它只能指向某一特定的值,它和这一值之间的映射关系被绑定了。所以 此时的 X 为常量。

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
马超 中级黑马 2012-5-26 13:43:42
7#
本帖最后由 依然小马哥 于 2012-5-26 13:46 编辑

int  x  =  20;
在栈内存和堆内存中的变化
先在堆内存中开辟了一个空间,我的(0x0012)假设是空间地址,
把空间地址指向在栈内存中的x,x这时候就指向了堆内存中的20.

注意:在栈内存中的是变量   堆内存中的是常量

回复 使用道具 举报
谢谢各位,偶明白了,对内存中如何存储数据有了进一步的认识。
回复 使用道具 举报
张亭 中级黑马 2012-5-29 15:50:22
9#
不是吧各位,基本类型数据根本没有指向或引用这一说吧,
基本类型数据就是在栈中开辟空间,然后在里面写上数据,不是在堆中写个数据,然后指向什么的

java中就两种数据类型:基本和引用,如果连int都指向堆了,全都是引用类型算了...
回复 使用道具 举报
马超 发表于 2012-5-26 13:43
int  x  =  20;
在栈内存和堆内存中的变化
先在堆内存中开辟了一个空间,我的(0x0012)假设是空间地址,

这都给分?也不看看对不对的...无语了
回复 使用道具 举报
在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配,当在一段代码块定义一个变量时,Java 就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java 会自动释放掉为该变量分配的内存空间,该内存空间可以立即被另作它用。
堆内存用来存放由 new 创建的对象和数组,在堆中分配的内存,由 Java 虚拟机的自动垃圾回收器来管理。在堆中产生了一个数组或者对象之后,还可以在栈中定义一个特殊的变量,让栈中的这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量,以后就可以在程序中使用栈中的引用变量来访问堆中的数组或者对象,引用变量就相当于是为数组或者对象起的一个名称。引用变量是普通的变量,定义时在栈中分配,引用变量在程序运行到其作用域之外后被释放。而数组和对象本身在堆中分配,即使程序运行到使用 new 产生数组或者对象的语句所在的代码块之外,数组和对象本身占据的内存不会被释放,数组和对象在没有引用变量指向它的时候,才变为垃圾,不能在被使用,但仍然占据内存空间不放,在随后的一个不确定的时间被垃圾回收器收走(释放掉)。
这也是Java比较占内存的原因,实际上,栈中的变量指向堆内存中的变量,这就是 Java 中的指针!

栈有一个很重要的特殊性,就是存在栈中的数据可以共享。假设我们同时定义:

  int a = 3;

  int b = 3;

  编译器先处理int a = 3;首先它会在栈中创建一个变量为a的引用,然后查找栈中是否有3这个值,如果没找到,就将3存放进来,然后将a指向3。接着处理int b = 3;在创建完b的引用变量后,因为在栈中已经有3这个值,便将b直接指向3。这样,就出现了a与b同时均指向3的情况。这时,如果再令a=4;那么编译器会重新搜索栈中是否有4值,如果没有,则将4存放进来,并令a指向4;如果已经有了,则直接将a指向这个地址。因此a值的改变不会影响到b的值。要注意这种数据的共享与两个对象的引用同时指向一个对象的这种共享是不同的,因为这种情况a的修改并不会影响到b, 它是由编译器完成的,它有利于节省空间。而一个对象引用变量修改了这个对象的内部状态,会影响到另一个对象引用变量。

回复 使用道具 举报
丁桂松 发表于 2012-5-29 17:56
在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配,当在一段代码块定义一个变量 ...

我承认  是我错了  看来我的基础真是太烂了  。。  回来还得温习一下啊
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马