java变量 值的改变 问题
下面是在网上看到的资料:3.Java中的数据类型有两种:一种是基本类型(primitivetypes),共有8种,即int,short,long,byte,float,d...
下面是在网上看到的资料:
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,还有基本数据类型都存放在栈?对象的实体不是存放在堆吗? 展开
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,还有基本数据类型都存放在栈?对象的实体不是存放在堆吗? 展开
4个回答
展开全部
变量名(a,b...)本身是一个地址,而变量的值是在内存中分配的实际的内存数据,比如int a=1,就是指a这个地址指向存放了字面量数据1的内存数据。
变量值的改变是变量表示的地址的改变,差不多就是你说的意思
不能说基本数据类型都存在于栈,这是不准确的,首先你要搞清楚线程这个概念,java运行中,每一个线程都维持一个线程栈(也可以说成方法栈,因为线程就是运行你的方法代码的),线程栈由一个个栈帧组成,每一个栈帧都表示一个方法的调用(处于栈顶的栈帧就是当前正在运行的方法),所以可以知道,方法中的变量都是存放在栈帧(栈)中的,如果变量引用的是对象,由于对象还是得在堆中分配,那么就会有一个栈中的变量指向堆中的一个对象。但是一个类本身可以有实例变量啊,如果这个变量是一个基本类型的话,那这个变量就存在于堆中了啊,也就是说基本数据类型也可以存放在堆中啊。
对象的实体确实是存放在堆中没错啊
还有什么不懂可以继续问。
更多追问追答
追问
变量存在堆中,拿他还是指向栈中的字面量数据对吗? 就像int a = 1,其中a是对象的成员变量,存放在堆中,1就是存放在栈中,那么a就是指向栈中的1,是不是这样? 那么凡是字面量数据都是存放在栈中咯?
追答
楼主有点误会我的意思了,如果基本数据类型a是对象的成员变量,那么a就是存放在堆中的啊(不是存放在栈中)。
展开全部
所有对象都是在堆里 栈里是引用地址
基本数据类型 比如int a=1; a在堆里1在栈里
基本数据类型 比如int a=1; a在堆里1在栈里
更多追问追答
追问
这么说对象实体的基本数据类型变量分配的内存 存放的是一个引用地址 这个引用地址指向栈里的数值?
追答
对
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
看看jvm前部分的内容(内存的划分),你就懂了
追问
有参考资料吗,PDF或者视频
追答
网上很多的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
说的不对,比如基本类型,不是栈里是应用,堆里是值。而是把值直接保存在栈里。
比如:int a = 3,这里就直接在栈里保存了一个3。
1,那么变量分配的内存存放的就是一个引用地址?变量的值的改变是引用地址的改变?
对于对象类型,比如,Person p = new Person();,这里p=内存地址(32位),实际的Person存放在堆里。
对于原类型,直接把值存放在栈中。
2,还有基本数据类型都存放在栈?对象的实体不是存放在堆吗?
基本类型,也有存放在堆中的,不能一概而论,一般来说,一个方法内部用到的基本类型,肯定存放于栈中。
关于堆栈的文章,推荐你看一下:http://blog.csdn.net/houzhaoling/article/details/7291362
比如:int a = 3,这里就直接在栈里保存了一个3。
1,那么变量分配的内存存放的就是一个引用地址?变量的值的改变是引用地址的改变?
对于对象类型,比如,Person p = new Person();,这里p=内存地址(32位),实际的Person存放在堆里。
对于原类型,直接把值存放在栈中。
2,还有基本数据类型都存放在栈?对象的实体不是存放在堆吗?
基本类型,也有存放在堆中的,不能一概而论,一般来说,一个方法内部用到的基本类型,肯定存放于栈中。
关于堆栈的文章,推荐你看一下:http://blog.csdn.net/houzhaoling/article/details/7291362
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询