首页 > 解决方案 > 为什么我们在 Java 中初始化数组对象时不必提供括号?

问题描述

我现在正在从头开始学习 Java,我发现有趣的一件事是大多数更复杂的数据结构必须以这种方式创建:

ArrayList<String> list = new ArrayList<String>();

另一方面,可以通过键入简单地初始化字符串

String[] str_array = new String[10];

为什么在初始化数组时不需要提供通常与调用构造函数相关的括号?这只是一种风格选择吗?如果对 JVM 有更好理解的人可以提供一些见解来满足我的好奇心,那就太棒了。

标签: javalanguage-lawyer

解决方案


对象创建和数组创建的区别在于:

  • 普通类具有被调用的构造函数。
    • 中的括号new ArrayList<String>()表示构造函数调用。
    • 即使构造函数没有参数,括号仍然必须存在(与没有参数的方法调用相同)。
  • 另一方面,数组类没有构造函数
    • 尽管数组是对象,但它们的类是由 JVM 创建的,因此需要进行其他类无法进行的特殊处理
    • 初始化数组是anewarray,multianewarraynewarray字节码指令的副作用。

数组类没有构造函数可以通过执行来证明

System.out.println(int[].class.getConstructors().length);

返回 0。


最后,这归结为语言设计者在 20 多年前做出的决定,这些决定受到其他现有语言(如 C++)的设计决定的影响。


推荐阅读