如果我们只是在java中声明一个没有初始化的变量,会在内存中发生什么?

Nav*_*een 6 java

如果我们只是创建一个引用变量或为原始数据类型或引用数据类型声明一个变量而不用以下任何值进行初始化,那么内存中会发生什么?

int x;

Employee emp;  
Run Code Online (Sandbox Code Playgroud)

那么两种情况下记忆中到底发生了什么?

是否在此阶段分配了任何内存,或者它是指向任何随机位置还是指向null或指向垃圾值?

与第二种情况一样,如果我们使用带有new运算符的构造函数或使用任何其他方法创建对象,则只会在内存中创建空间.

Employee emp = new Employee();
Run Code Online (Sandbox Code Playgroud)

use*_*038 5

Java虚拟机(JVM)从操作系统分配堆内存,然后为Java应用程序管理自己的堆。当应用程序创建新对象(例如Employee emp = new Employee())时,JVM会分配一个连续的堆内存区域来存储它。

虽然未初始化对象(例如Employee emp = null),但无需分配任何内存。但是,即使没有显式设置原始类型(在全局范围内),也将使用默认值对其进行初始化(例如int x实际上是int x = 0)。因此,在这种情况下,也会分配内存。

只要在应用程序内的任何地方都保留了对对象的引用,该对象就会保留在内存中。不再引用的对象将由垃圾收集器(GC)处理,并将被清除出堆以回收其空间。

String班还分配堆内存,采用了小调整,但:字符串实习时,只要你分配的多个实例String使用相同的文字。因此,实际上您在内存中将只有一个实例,但是有多个引用它的变量。


Ani*_*udh 4

如果它们是实例变量并且您没有分配任何值

然后对于基元分配以下默认值:

布尔值

字节0

字符\u0000

0

整数0

0L

浮动0.0f

:0.0d

对象被初始化为null

局部变量或方法内的变量必须在使用之前进行初始化,否则您的代码将无法编译。

  • 请注意最后一条评论:它们必须在使用之前进行初始化。`int a; a=5;` 是合法的,`int a; int b = a;` 无法编译 (4认同)