5

在运行时初始化的每个数组都是动态的,而在编译期间初始化的每个数组都是静态的,这是真的吗?

例如:

int array[];                 
public main() {      
    array = new int[100];    
}

编译器知道数组有多少元素,所以它可以在编译期间初始化它吗?还是我需要给每个 int 一个值以便它变成静态的?像这样:

int array[3] { 1, 2, 3};              

是否可以定义一个数组在 main() 函数之外应该有多少个元素?(不给每个 int 一个值)像这样:

int array[100];      
public main() {
}

我正在编写一个小游戏,它必须运行得非常快。我读到动态数组需要更长的时间来处理,所以我想尝试使用静态数组,但我不确定数组何时变为静态或动态。我搜索了许多不同的教程,但我找不到答案。
谢谢阅读。

4

3 回答 3

9

动态分配和静态分配的区别是模棱两可的(它在某种程度上取决于语言的含义)。在最一般的意义上,静态分配意味着一些大小已经预先确定,可能是在编译时。

在 java 中,任何对象(包括数组)总是在运行时分配。这并不一定意味着它是动态的,它可能仍然是静态的,因为它不能在运行时更改。例子:

public class Test1 {
    public final int[] array1 = new int[10];

    public int[] array2 = new int[20];

    public void setArray2Size(int size) {
         array2 = new int[size];
    }
}

array1 的大小为 10,并且不能在运行时更改。请注意final关键字。这允许您只分配一次“array1”成员。所以你不能给这个成员分配不同的数组。

现在,array2 不是最终的,因此您可以随时为其分配不同的数组,就像 setArray2Size() 方法一样。如果在初始赋值之后没有赋值,array2 仍然是静态的,因为它不能被更改(因为没有代码可以这样做),尽管通过声明更改它是允许的。

数组的具体实例一旦创建就无法调整大小(在 java 中没有语言元素可以表示调整数组的大小)。对于初学者来说有点难以掌握,但是像 array2 这样的变量不是 array。它是对数组的引用。但是,您可以将 array2 持有的引用替换为对另一个数组的引用,如 setArray2Size() 方法中的 array2 所示。

于 2013-04-18T08:26:43.413 回答
4

时未分配内存declaration

例如:int array[100]; ; ——不会compiles

仅在new遇到运算符时才memory分配。

所以

array = new int[100]; ; 编译。

于 2013-04-18T06:56:08.780 回答
1

是的,数组的大小仅在编译时才知道,但内存分配将在运行时发生。在遇到“新”内存之前,不会将其分配给数组。

于 2016-07-04T05:08:17.217 回答