java变量 值的改变 问题

下面是在网上看到的资料:
3. Java中的数据类型有两种:
一种是基本类型(primitive types), 共有8种,即int, short, long, byte, float, double, boolean, char(注意,并没有string的基本类型)。这种类型的定义是通过诸如int a = 3; long b = 255L;的形式来定义的,称为自动变量。值得注意的是,自动变量存的是字面值,不是类的实例,即不是类的引用,这里并没有类的存在。如int a = 3; 这里的a是一个指向int类型的引用,指向3这个字面值。这些字面值的数据,由于大小可知,生存期可知(这些字面值固定定义在某个程序块里面,程序块退出后,字段值就消失了),出于追求速度的原因,就存在于栈中。
另外,栈有一个很重要的特殊性,就是存在栈中的数据可以共享。假设我们同时定义:
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与b的值后,再令a=4;那么,b不会等于4,还是等于3。在编译器内部,遇到a=4;时,它就会重新搜索栈中是否有4的字面值,如果没有,重新开辟地址存放4的值;如果已经有了,则直接将a指向这个地址。因此a值的改变不会影响到b的值。

从这段资料介绍得知,1,那么变量分配的内存存放的就是一个引用地址?变量的值的改变是引用地址的改变?2,还有基本数据类型都存放在栈?对象的实体不是存放在堆吗?

    变量名(a,b...)本身是一个地址,而变量的值是在内存中分配的实际的内存数据,比如int a=1,就是指a这个地址指向存放了字面量数据1的内存数据。

    变量值的改变是变量表示的地址的改变,差不多就是你说的意思

    不能说基本数据类型都存在于栈,这是不准确的,首先你要搞清楚线程这个概念,java运行中,每一个线程都维持一个线程栈(也可以说成方法栈,因为线程就是运行你的方法代码的),线程栈由一个个栈帧组成,每一个栈帧都表示一个方法的调用(处于栈顶的栈帧就是当前正在运行的方法),所以可以知道,方法中的变量都是存放在栈帧(栈)中的,如果变量引用的是对象,由于对象还是得在堆中分配,那么就会有一个栈中的变量指向堆中的一个对象。但是一个类本身可以有实例变量啊,如果这个变量是一个基本类型的话,那这个变量就存在于堆中了啊,也就是说基本数据类型也可以存放在堆中啊。

    对象的实体确实是存放在堆中没错啊


还有什么不懂可以继续问。 

追问

变量存在堆中,拿他还是指向栈中的字面量数据对吗? 就像int a = 1,其中a是对象的成员变量,存放在堆中,1就是存放在栈中,那么a就是指向栈中的1,是不是这样? 那么凡是字面量数据都是存放在栈中咯?

追答

楼主有点误会我的意思了,如果基本数据类型a是对象的成员变量,那么a就是存放在堆中的啊(不是存放在栈中)。

追问

那么 对象里的a 指向的字面值也是存放在堆里?

追答

是的没错。

追问

有相关资料吗

追答

iteye中有很多文章你可以看看。另,推荐你一本书《深入理解Java虚拟机:JVM高级特性与最佳实践》,讲的很不错。

温馨提示:内容为网友见解,仅供参考
第1个回答  2012-11-03
所有对象都是在堆里 栈里是引用地址
基本数据类型 比如int a=1; a在堆里1在栈里追问

这么说对象实体的基本数据类型变量分配的内存 存放的是一个引用地址 这个引用地址指向栈里的数值?

追答

追问

有参考资料吗?

追答

http://blog.csdn.net/java2000_wl/article/details/8009362
你可以去看看!我这有视频

追问

能发视频下载地址给我吗?谢谢

追答

视频不是在线的 是自己录的!

第2个回答  2012-11-05
看看jvm前部分的内容(内存的划分),你就懂了追问

有参考资料吗,PDF或者视频

追答

网上很多的

第3个回答  2012-11-04
说的不对,比如基本类型,不是栈里是应用,堆里是值。而是把值直接保存在栈里。
比如:int a = 3,这里就直接在栈里保存了一个3。
1,那么变量分配的内存存放的就是一个引用地址?变量的值的改变是引用地址的改变?
对于对象类型,比如,Person p = new Person();,这里p=内存地址(32位),实际的Person存放在堆里。
对于原类型,直接把值存放在栈中。
2,还有基本数据类型都存放在栈?对象的实体不是存放在堆吗?
基本类型,也有存放在堆中的,不能一概而论,一般来说,一个方法内部用到的基本类型,肯定存放于栈中。
关于堆栈的文章,推荐你看一下:http://blog.csdn.net/houzhaoling/article/details/7291362

java变量 值的改变 问题
变量值的改变是变量表示的地址的改变,差不多就是你说的意思 不能说基本数据类型都存在于栈,这是不准确的,首先你要搞清楚线程这个概念,java运行中,每一个线程都维持一个线程栈(也可以说成方法栈,因为线程就是运行你的方法代码的),线程栈由一个个栈帧组成,每一个栈帧都表示一个方法的调用...

java 全局变量的值可以改变吗??
如果全局变量的类型是“public static final”的,那么变量的值是不会被改变的;如果全局变量的类型是“public static ”的,那么变量的值是可以被随意改变的;解释:在java中final变量表示的是最终的,也就是在程序初始化加载到内存中,之后不可以被任何对象修改,如果没被定义为final的话,可以重新赋值...

java中先创建一个对象,改变方法中变量的值会改变这个对象的值吗
对。在编程领域创建一个变量后就已经随即确定了这个变量的值了,变量不改变是不能改变他的值,除非将变量进行改变,它的值才会跟随相应的进行变化,不然是不会改变的。

java全局变量 在一个方法中改变它的值,怎样在另一个方法中使用改变后的...
如果不是 那还有一种可能,在第一个方法中,有定义了一个同名的变量 此时的话,新定义的会屏蔽全局变量。无论怎么改变,全局变量都不会变 因此再其他地方调用的话,就是原来的值 所以,全局变量定义之后,不要在方法中定义相同名的变量,直接赋值等操作就可以 ...

JAVA中变量赋值时赋予的变量值会随着被赋予的变量的值改变而改变吗?
不会。程序都是一条龙走下去的,后面的改变只会影响后面的

用JAVA写“对两个整数变量的值进行互换(不需要第三方变量)”程序
JAVA对两个整数变量的值进行互换(不需要第三方变量)的程序如下:方法一(加减法):a = a + b;b = a - b;a = a - b;方法二(异或运算):a = a ^ b;b = a ^ b;a = a ^ b;代码实现如下:public class Demo { public static void main(String [] args){ int m=2,...

Java之中的if条件句中的变量值如何调换?
改成 int c=a;a = b;b = c;

怎么改变变量的值?
声明变量的Lnode类型为x,结构节点为类型,的LL值,传递引用,传递指针*L,如果需要更改原始值,则需要使用引用或传递指针,节点*年龄;\/定义指针LNode.LNode*s=H;\/ H是定义指针年龄LNode及其初始值设置为H存储器地址的定义头节点。链接列表年龄;和LNode*s;它不能在同一个函数中。

java中修改了变量的值怎么能让变量刷新呢?repaint函数不管用,我还写...
JFrame有个方法叫rep开头的方法,意思是重新绘制 调用他应该没问题,不过哥们,在真正的企业做swing开发,这个几个东西用一个变量,是用beansBinding实现的 将变量绑定在一起 改变一个就全部改变,好比文本框的值 一般是直接去取值,但是这样没有打到MVC的效果,一般会建立一个实体类 属性对应文本框绑定...

JAVA变量的使用范围的简单问题?
如果{}中是int x =3(注意这个是在{}中声明了一个新的变量); 则在{}外是访问不到这个x的,只能访问到外面的x。如果在{}里面是x=3,(注意这个是修改{}外面声明的x)则表示把{}外面生成的x改成了3.则输出的就是3

相似回答