Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
静态数组如何存储在Java内存中?_Java_C_Arrays_Memory_Static - Fatal编程技术网

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

静态数组如何存储在Java内存中?,java,c,arrays,memory,static,Java,C,Arrays,Memory,Static,因此,在像C这样的语言中,内存被分成5个不同的部分:操作系统内核、文本段、静态内存、动态内存和堆栈。大概是这样的: public class Test { static int[] a = new int[1]; public static void main( String[] args ) { a = new int[2]; } } 如果我们在C语言中声明了一个静态数组,那么您必须事先指定它的大小,然后才

因此,在像C这样的语言中,内存被分成5个不同的部分:操作系统内核、文本段、静态内存、动态内存和堆栈。大概是这样的:

public class Test {
        static int[] a = new int[1];

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

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

但我注意到,在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中有没有办法在静态内存中分配数组(如果没有,为什么没有)?这难道不能更快地访问这些阵列吗?
EDIT2:^这是一个新问题:

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


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

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

在java中,无论何时使用单词
new
,该对象的内存都会在堆上分配,并返回一个引用。对于阵列也是如此。
int[]a
只是对
newint[1]
的引用。当您执行
新建int[2]
时,将分配一个新数组并将其指向。旧阵列将在需要时进行垃圾收集

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

的静态存储,而
静态变量作为类对象的一部分存在。将其视为类本身的实例变量。在您的示例中,
a
是一个引用变量,它引用某个数组(或者根本没有数组,如果它是
null
),但是数组本身被分配,因为所有数组都在Java中:堆外。

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

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

+1,要更深入地了解C的
static
与Java的
static
相比,实际上所示的模型对于C甚至不是普遍适用的。对于您的普通桌面,它可能是适用的,但是C中的内存模型非常简单和慷慨。嵌入式系统上的C看起来会完全不同。@tskuzzy:你应该问你的后续问题作为另一个问题来消除下面答案的歧义。@sixlettervariables:谢谢,可以。我不相信“在像C这样的语言中,内存是分开的”。语言标准非常谨慎,没有规定任何内存实现细节。而且,你的图片只有三个命名的片段,但你声称有五个。@Kerrek SB:其实它本身并不是“分离”的。但肯定有不同的记忆区域。我不确定标准是怎么说的,但我认为大多数计算机遵循与所描述的类似的内存布局。“Reserved”=“OS Kernel”,我猜他们将图片中的文本段与静态数据段结合起来。