在Java中初始化数组对象时,为什么不必须提供括号?

时间:2019-03-27 04:16:55

标签: java language-lawyer

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

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

另一方面,只需键入以下内容即可初始化字符串

String[] str_array = new String[10];

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

2 个答案:

答案 0 :(得分:1)

对象创建和数组创建之间的区别是:

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

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

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

返回0。


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

答案 1 :(得分:-1)

不能以与创建ArrayList相同的方式创建数组。正如user207421所说,“数组被设计为通过使用[] 进行初始化”。 (例如)

ArrayList aList = new ArrayList(); // It is valid

Arrays aArr = new Arrays();// It is invalid. Since there is no public constructor in java.util.Arrays

源代码: http://hg.openjdk.java.net/jdk8u/jdk8u/jdk/file/be44bff34df4/src/share/classes/java/util/Arrays.java

C和C ++语言使用相同的[]初始化数组。这样Java也随之而来。