Java程序运行时,没有赋值的基本类型变量会在内存中分配空间吗?

比如“int a;”,a在栈中会占用空间吗?我现在的理解是:JVM会在内存中(可能是栈,或者其他内存区域)中开辟一个空间(可能是32bit,可能是64bit)。a这个符号在JVM中就被映射成这快空间的地址,暂且称这块空间为x。而x这块空间存储的其实是另外一块内存空间的地址的二进制值,所以当出现“int a = 5;”时,jvm会在内存(栈)中开辟一块空间存储5的二进制数值,然后取得这块二进制数值为5的内存空间的地址,然后把这个地址存入x当中。所以a是个引用变量,它存储的其实是5所在的内存空间的表示地址。
请问我这样理解是正确的吗?

基本类型的变量如果是临时变量,只要定义了,就会分配内存空间,不管是否被赋值;如果是作为对象的属性出现,只要该对象不实例化,就不会分配内存空间。

一个完整的Java程序运行过程会涉及以下内存区域:
1、寄存器:JVM内部虚拟寄存器,存取速度非常快,程序不可控制。
2、 栈:保存局部变量的值,包括:
1)用来保存基本数据类型的值;
2)保存类的实例,即堆区对象的引用(指针)
3)也可以用来保存加载方法时的帧
3、堆:用来存放动态产生的数据,比如new出来的对象。注意创建出来的对象只包含属于各自的成员变量,并不包括成员方法。因为同一个类的对象拥有各自的成员变量,存储在各自的堆中,但是他们共享该类的方法,并不是每创建一个对象就把成员方法复制一次。

4、常量池:JVM为每个已加载的类型维护一个常量池,常量池就是这个类型用到的常量的一个有序集合。包括直接常量(基本类型,String)和对其他类型、方法、字段的符号引用(1)。池中的数据和数组一样通过索引访问。由于常量池包含了一个类型所有的对其他类型、方法、字段的符号引用,所以常量池在Java的动态链接中起了核心作用。常量池存在于堆中。

5、代码段:用来存放从硬盘上读取的源程序代码。
6、数据段:用来存放static定义的静态成员。

注意:
1.一个Java文件,只要有main入口方法,我们就认为这是一个Java程序,可以单独编译运行。
2.无论是普通类型的变量还是引用类型的变量(俗称实例),都可以作为局部变量,他们都可以出现在栈中。只不过普通类型的变量在栈中直接保存它所对应的值,而引用类型的变量保存的是一个指向堆区的指针,通过这个指针,就可以找到这个实例在堆区对应的对象。因此,普通类型变量只在栈区占用一块内存,而引用类型变量要在栈区和堆区各占一块内存。
温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2018-02-28
你理解混了。
我们要看你这句int a处于什么地方,如果是在方法内部中被执行到,也就是说是局部变量,就会在栈内存中分配内存,由于是int型,所以就是4字节,也就是32bit,long类型的才会是64bit。

而你说的表示地址我们称为堆内存。创建的对象以及对象中的方法和数据是存储在堆内存中的。JVM会在栈内存中建立对象的引用,然后当执行到new语句时,在堆内存中创建对象,这时就将这个对象的类型以及这块区域的内存地址值赋给引用,然后进行对象中数据的初始化。也就是说,对象的引用存储在栈内存中,存放的是类型以及hash值,如Integer@0xff67。而对象里的内容实际上是存储在堆内存中的。
如果你这句int a只是在某个对象内作为成员变量,那么根本不会涉及到栈内存。a就存储在它所在的那个对象的堆内存中。明白了么?
java的内存区分,除了栈内存、堆内存,还有方法区以及字符串的串池等。如果你有兴趣,可以去搜搜看。骚年,努力吧!本回答被网友采纳
第2个回答  2014-09-18
确实会占用,你的理解是正确的。Java变量在内存中的储存分为引用和值两部分。就基本类型的局部变量而言,如果两个变量具有相同的值,那么他们就是指向相同地址的不同引用。比如int a = 5;int b = 5;那么a和b在内存中占有不同的引用所在的空间,但指向相同的值(即5)所在的空间。但是,关注一个未初始化的变量是否占有内存意义是不大的,因为Java语言规定,要使用变量,变量必须初始化(即使是看似可以不初始化的成员变量,其声明时仍然有默认的初始值)。从业务逻辑的角度上来看,未初始化的变量也是无法被使用的。因此一般情况下我们会笼统地将变量的引用和变量的值所占的空间统一起来看,不会单纯地分开来看。如果两个引用指向同一个对象,我们会认为两个引用使用的是同一个地址,而不会细节到两个不同的引用地址和一个值地址。
如果说的不对还请见谅,希望能解决你的疑惑。
第3个回答  2019-12-06
要看你这句int a处于什么地方,如果是在方法内部中被执行到,也就是说是局部变量,就会在栈内存中分配内存,由于是int型,所以就是4字节,也就是32bit,long类型的才会是64bit。
而你说的表示地址我们称为堆内存。创建的对象以及对象中的方法和数据是存储在堆内存中的。JVM会在栈内存中建立对象的引用,然后当执行到new语句时,在堆内存中创建对象,这时就将这个对象的类型以及这块区域的内存地址值赋给引用,然后进行对象中数据的初始化。也就是说,对象的引用存储在栈内存中,存放的是类型以及hash值,如Integer@0xff67。而对象里的内容实际上是存储在堆内存中的。
如果你这句int a只是在某个对象内作为成员变量,那么根本不会涉及到栈内存。a就存储在它所在的那个对象的堆内存中。明白了么?
第4个回答  2014-09-18
看不懂你说什么,不过好像大致没错,你说的这种情况和普通对象类似.
简单说,栈存的是地址,堆存的是具体数据
你说的没有赋值的基本类型,比如方法中的基本类型就这样的情况
不过不赋处置,编译器都过不了
不赋初值的不是你说的这种情况
相似回答