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

时间:2015-04-30 12:25:45

标签: java

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

int x;

Employee emp;  

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

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

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

Employee emp = new Employee();

3 个答案:

答案 0 :(得分:5)

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

虽然未初始化对象(例如Employee emp = null),但不需要分配任何内存。但是,原始类型(在全局范围内)使用默认值进行初始化,即使您未明确设置它(例如int x实际上是int x = 0)。所以在这种情况下,也会分配内存。

只要对象的引用保留在应用程序中的任何位置,对象就会保留在内存中。不再引用的对象将由垃圾收集器(GC)处理,并将从堆中清除以回收它们的空间。

String类也分配堆内存,虽然使用String interning,但只要使用相同的文本分配多个String实例,就会使用http://www.elastic.co/guide/en/elasticsearch/guide/master/logging.html。所以,实际上你在内存中只有一个实例,但是引用它的多个变量。

答案 1 :(得分:2)

如果它们是实例变量而您没有指定任何值

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

布尔 false

字节 0

char \ u0000

0

int 0

0L

浮动 0.0f

加倍:0.0d

对象初始化为 null

方法中的

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

答案 2 :(得分:0)

原始类型将使用默认值启动(0表示int,false表示布尔值,...)。因此它将使用该类型的内存大小(int为32位)。 See the doc for default values and size

其他对象将初始化为null,因此在内存中仅使用引用(通常是本机指针大小为32或64位,see this answer)。