静态数组如何存储在Java内存中?

所以在像C这样的语言中,内存分为5个不同的部分:OS内核,文本段,静态内存,动态内存和堆栈。 像这样的东西:

内存布局

如果我们在C中声明了一个静态数组,那么你必须事先指定它的大小,然后才能永久修复它。 该程序将为arrays分配足够的内存,并按预期将其粘贴在静态数据段中。

但是我注意到在Java中你可以这样做:

public class Test { static int[] a = new int[1]; public static void main( String[] args ) { a = new int[2]; } } 

一切都会像你期望的那样奏效。 我的问题是,为什么这在Java中有效?

编辑:所以共识是Java中的int[]更像C中的int* 。因此作为后续问题,有没有办法在Java中的静态内存中分配数组(如果没有,为什么不呢) ? 这不会更快地访问这样的arrays吗? EDIT2:^现在这是一个新问题: 静态类变量存储在内存中的哪个位置?

在java中,只要你使用new这个词,就会在堆上分配该对象的内存并返回引用。 对arrays也是如此。 int[] a只是对new int[1]的引用。 当你执行new int[2] ,会分配一个新数组并指向a。 旧数组将在需要时进行垃圾回收。

a的值只是对象的引用。 数组创建表达式( new int[2] )创建一个大小合适的对象,并为a指定一个引用。

请注意,Java中的static与C中的static是完全分开的。在Java中,它仅表示“与类型相关而不是与类型的任何特定实例相关”。

您正在创建一个新数组,而不是修改旧数组。 新数组将获得自己的空间,旧数组将被垃圾收集(只要没有其他人拥有对它的引用)。

我假设当你提到“静态内存”时,你指的是堆。 在Java中,堆的作用与您提到的“静态数据段”类似。 堆是大多数对象分配的位置,包括数组。 另一方面,堆栈是放置仅在单个方法的生命期间使用的对象的位置。

在Java中,您只是要求为类Test静态存储对数组的强类型引用。 您可以更改运行时引用的内容,包括更改大小 。 这将是C *相当于int*的静态存储。

在Java中, static变量作为类对象的一部分存在。 可以将其视为类本身的实例变量。 在您的示例中, a是一个引用变量,它引用一些数组(或者根本没有数组,如果它是null ),但是数组本身是在所有数组都在Java中的时候分配的:离开堆。

静态在Java中有不同的含义。 在Java中,当您将变量声明为static时,它是一个类变量而不是实例变量。