1

我开始学习java,我发现在数组的声明中我们不能像这样指定它的大小(在C中使用):

int a[10];

但我们必须这样做:

int[] a=new int[10];
int a[]=new int[10];

为什么 java 在这里看起来很复杂,而不是像 C 风格那样允许数组声明?

4

3 回答 3

14

因为 Java 不是 C。它与 C 有一些共同的习语(实际上很多),但 Java 语言开发人员在他们的努力中并没有完全感谢 C 语言。

数组本身是存储在堆上的对象,因此需要new创建它们。对数组的引用 a[]很可能存储在堆栈中,但这不是数组本身。

于 2012-11-10T06:37:05.233 回答
1

在 java 中,数组是对象。Java 将这些基本数组包装在一个对象中,因此可以在数组上调用对象的所有方法。

**int a[]** = new int[5];

5方括号内表示您将存储五个值,并且是数组“n”的大小。

  1. 声明:以粗体显示的代码是所有将变量名与对象类型相关联的变量声明。
  2. 实例化:new关键字是创建对象的 Java 运算符。并且由于在 java 中数组是对象,所以.

  3. 初始化:new 操作符之后是对构造函数的调用,该构造函数初始化新对象。

注意。

在java中,内存不断被动态分配(对象由new运算符动态分配内存)然后“被遗忘”(语言实际上迫使你忘记它们)。也就是说,编码器将其留给垃圾收集引擎来清理他的内存分配混乱。在 C 中,静态内存分配的概念允许声明

int a[10];

参考:Java 数组

于 2012-11-10T07:29:11.430 回答
0

这是更大图景的一部分:Java 中没有堆栈分配的结构。这就是类型系统可以划分为原始类型引用类型的原因。后者的实例是通过引用动态分配和访问的。这是 Java 设计的深层不变量。

其原因可以追溯到 Java 设计的关键驱动目标:成为一种简单的语言,具有尽可能少的陷阱,同时仍提供足够的表达能力。

您可能会问堆栈分配数组有什么复杂之处:当您尝试将其传递给另一个函数时,麻烦就开始了。按值传递是不可能的,按引用传递意味着对堆栈分配对象的引用会脱离方法的范围,因此它可能在释放后被取消引用。

于 2012-11-10T09:31:03.993 回答