我开始学习java,我发现在数组的声明中我们不能像这样指定它的大小(在C中使用):
int a[10];
但我们必须这样做:
int[] a=new int[10];
int a[]=new int[10];
为什么 java 在这里看起来很复杂,而不是像 C 风格那样允许数组声明?
因为 Java 不是 C。它与 C 有一些共同的习语(实际上很多),但 Java 语言开发人员在他们的努力中并没有完全感谢 C 语言。
数组本身是存储在堆上的对象,因此需要new
创建它们。对数组的引用 a[]
很可能存储在堆栈中,但这不是数组本身。
在 java 中,数组是对象。Java 将这些基本数组包装在一个对象中,因此可以在数组上调用对象的所有方法。
**int a[]** = new int[5];
5
方括号内表示您将存储五个值,并且是数组“n”的大小。
实例化:new关键字是创建对象的 Java 运算符。并且由于在 java 中数组是对象,所以.
初始化:new 操作符之后是对构造函数的调用,该构造函数初始化新对象。
注意。
在java中,内存不断被动态分配(对象由new运算符动态分配内存)然后“被遗忘”(语言实际上迫使你忘记它们)。也就是说,编码器将其留给垃圾收集引擎来清理他的内存分配混乱。在 C 中,静态内存分配的概念允许声明
int a[10];
这是更大图景的一部分:Java 中没有堆栈分配的结构。这就是类型系统可以划分为原始类型和引用类型的原因。后者的实例是通过引用动态分配和访问的。这是 Java 设计的深层不变量。
其原因可以追溯到 Java 设计的关键驱动目标:成为一种简单的语言,具有尽可能少的陷阱,同时仍提供足够的表达能力。
您可能会问堆栈分配数组有什么复杂之处:当您尝试将其传递给另一个函数时,麻烦就开始了。按值传递是不可能的,按引用传递意味着对堆栈分配对象的引用会脱离方法的范围,因此它可能在释放后被取消引用。