Java中的数组创建(C++风格)

15

为什么我们不能在Java中像这样创建数组:

int marks[5];

在声明之后分配值吗?

请问有人可以解释这个术语或区别吗。


1
你试过了吗?结果如何? - user647772
3
你能否详细说明你的问题,似乎你在问“为什么Java不使用与C++完全相同的语法?”也许只有熟悉C++和Java而不仅仅是Java的人才能更好地理解这个问题。请注意,我的翻译不会改变原意,但会使内容更加通俗易懂。 - Kevin D
2
@Tichodroma:他可能尝试过,结果是“语法错误,标记为'5',请删除此标记”。 - Michael Borgwardt
5个回答

21

这是因为 Java 中没有栈数组。这里是 Java 的等效写法:

int[] marks = new int[5];

这看起来很像在C ++中分配动态大小的数组。当然,您不必担心调用delete[],因为它是垃圾回收的。


13

由于你引用的语法是在栈上分配数组,而Java数组是对象,所有Java对象都分配在堆上(除了最近的JVM优化,但这些是隐含的)。

在没有手动内存管理的语言中,这基本上是必须的,因为栈分配的东西在调用返回时会消失,导致悬空指针问题,Java的一个基本特性就是不允许出现这种情况。

当然,有人可以争论说Java应该使用栈分配语法来进行堆分配,但那样会使任何了解C语言的人感到困惑 - 这不好。


5
在Java中,数组的大小是由创建它的表达式决定的,例如:
int[] marks = new int[5];

或者

int[] marks = {1,2,3,4,5};

请注意,虽然 Java 允许使用 int marks[] 的语法(Java 为了与 C++ 兼容而有多种这样的规则),但不建议这样做,语法 int[] marks 更符合惯用语法,因此更受推荐。


3
int[] marks = new int[]{1, 2, 3};

哦,是的,我忘记删掉那个5了。 - thatidiotguy

1

因为数组是Object类型(继承自Object类)。而要创建一个对象,必须使用new关键字。(大多数情况下)
我认为new关键字背后的原因是表示这些变量是对动态分配实例的引用。


好的...现在有点明白了...谢谢 - hasankamal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接