如果我们只是在java中声明一个没有初始化的变量,会在内存中发生什么?
如果我们只是创建一个引用变量或为原始数据类型或引用数据类型声明一个变量而不用以下任何值进行初始化,那么内存中会发生什么?
int x; Employee emp;
那么两种情况下记忆中到底发生了什么?
是否在此阶段分配了任何内存,或者它是指向任何随机位置还是指向null或指向垃圾值?
与第二种情况一样,如果我们使用带有new运算符的构造函数或使用任何其他方法创建对象,则只会在内存中创建空间。
Employee emp = new Employee();
Java虚拟机(JVM)从操作系统分配堆内存,然后为Java应用程序管理自己的堆。 当应用程序创建新对象(例如, Employee emp = new Employee()
)时,JVM会分配一个连续的堆内存区域来存储它。
虽然未初始化对象(例如, Employee emp = null
),但不需要分配任何内存。 但是,原始类型(在全局范围内)使用默认值进行初始化,即使您未明确设置它(例如, int x
实际上是int x = 0
)。 所以在这种情况下,也会分配内存。
只要对象的引用保留在应用程序中的任何位置,对象就会保留在内存中。 不再引用的对象将由垃圾收集器(GC)处理,并将从堆中清除以回收其空间。
String
类也分配堆内存,虽然使用了一点调整:只要你使用相同的文本分配多个String
实例,就会使用String interning 。 所以,实际上你在内存中只有一个实例,但引用它的是多个变量。
如果它们是实例变量,则不指定任何值
然后,对于基元 ,分配以下默认值:
布尔值 : false
字节 : 0
char : \ u0000
短 : 0
int : 0
长 : 0L
float : 0.0f
double :0.0d
对象初始化为null
方法中的局部变量或变量必须在使用之前初始化,否则代码将无法编译。
原始类型将使用默认值启动(0表示int,false表示布尔值,…)。 因此它将使用该类型的内存大小(int为32位)。 请参阅doc以获取默认值和大小
其他对象将初始化为null
因此在内存中仅使用引用(通常是本机指针大小32或64位, 请参阅此答案 )。